范围的多个实例的自动化管理 SQL Server 称为 多服务器管理。 使用多服务器管理可以执行下列操作:
管理两台或多台服务器。
在企业服务器之间安排数据仓库的信息流。
若要利用多服务器管理,您必须至少有一台主服务器且至少有一台目标服务器。 主服务器将作业分发到目标服务器并从它那里接收事件。 主服务器还存储在目标服务器上运行的作业的作业定义的中央副本。 目标服务器定期连接到主服务器来更新它们的作业计划。 如果主服务器上存在新作业,目标服务器将下载该作业。 目标服务器在完成作业后,会重新连接到主服务器并报告作业状态。 请注意,在执行任何数据库时,作业定义必须是同一个相关活动。
以下图例显示了主服务器与目标服务器之间的关系。
将该备份作业一次性写入主服务器,然后将部门服务器登记为目标服务器。 从它们登记时刻起,所有部门服务器将运行相同的备份作业,而您只需定义一次作业。
开始测试吧!!本测试为单服务器上的双实例.
MSSQL 2014 :HZC\MSSQLSERVER (主服务器实例)
MSSQL 2016 :HZC\DOG (目标服务器实例)
首先改注册表,取消主服务器和目标服务器之间的加密。打开注册表,搜索更改两个选项。
MsxEncryptChannelOptions = 0
AllowDownloadedJobsToMatchProxyName = 0
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\SQLServerAgent\MsxEncryptChannelOptions
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\SQLServerAgent\AllowDownloadedJobsToMatchProxyName
说明如下:
值 |
说明 |
0 |
在该目标服务器和主服务器之间禁用加密。 请仅在目标服务器和主服务器之间的通道已使用其他方法进行了保护时才选择此选项。 |
1 |
仅在该目标服务器和主服务器之间启用加密,但不需要证书验证。 |
2 |
在该目标服务器和主服务器之间启用完全 SSL 加密和证书验证。 这是默认设置。 除非出于特定的原因要选择其他值,否则建议不要对其进行更改。 |
代理启动账户添加到实例账户中,并授予服务器角色 sysadmin
接下来直接开始吧!右键主服务器代理,将当前设置为主服务器
到这一步,在已注册服务器中将目标实例添加上,下一步步完成即可!
(打开已注册服务器:菜单栏——》视图——》已注册服务器——》将服务器添加)
或者一个命令即可配置完成!将当前服务器添加到主服务器的可用服务器列表中(目标实例执行)
--将当前服务器添加到主服务器的可用服务器列表中(目标实例执行) EXEC msdb.dbo.sp_msx_enlist @msx_server_name = N'HZC', --主服务器 @location = N'location' --要添加的目标服务器的位置 GO
好了,代理的名字变了,配置完成!可以看到,主服务器实例代理下区分了“本地作业” 和 “多服务器作业”。
现在简单创建一个作业,步骤执行内容为 :select getdate() 。最后一个选项 “目标”,这是区分本地还是多服务器的作业,如下勾选目标服务器:
很快,发现同步了。
现在打开目标管理器进行同步管理。右键主服务器代理——》多服务器管理——》管理目标服务器
这时最近一次同步的时间。
作业 “test2” 是主服务器刚创建的,创建时或者修改时,记录会记录在 “下载指令” 中。目标服务器会逐条执行这些记录,若“下载日期” 不为空,则表示已经同步过来了。
--下载指令(主实例执行) EXEC msdb.dbo.sp_help_downloadlist SELECT * FROM msdb.dbo.sysdownloadlist GO
若指令出现了错误,也可以将错误的指令删除。
-- Delete from msdb.dbo.sysdownloadlist where instance_id < 5 --可以直接删除
若需要某条指令重新同步或新增同步,可以将指令插入到表 sysdownloadlist 中。
--向系统表 sysdownloadlist 中插入操作(行),以供目标服务器下载和执行(主实例执行) --https://msdn.microsoft.com/zh-cn/library/ms173737.aspx DECLARE @jobid CHAR(36) SELECT @jobid=job_id FROM msdb.dbo.sysjobs WHERE name = 'test2' EXEC msdb.dbo.sp_post_msx_operation @operation = 'INSERT', @object_type = 'JOB', @job_id = @jobid, @specific_target_server = 'HZC\DOG' GO
目标服务器的作业会记录每次执行信息,而主服务器中的 【作业活动监视器】可以看到所有作业最近的状态。
--作业活动监视器(目标服务器作业失败了会反映到这里(主实例执行) EXEC msdb.dbo.sp_help_job SELECT * FROM msdb.dbo.sysjobservers GO
现在将本地作业改为多服务器作业。
--将本地作业更改为多服务器作业(主实例执行) EXEC msdb.dbo.sp_delete_jobserver @job_name=N'test', @server_name = N'HZC' GO EXEC msdb.dbo.sp_add_jobserver @job_name = N'test', @server_name = N'HZC\DOG' GO
存储过程 sp_delete_jobserver 和 sp_add_jobserver
只是对服务器的选项选择,也可以两个都不选(只能sp_delete_jobserver执行),选择一个时必须先删除掉另一个。
现在说说管理界面吧!
看到四个选择:脱离,设置轮询间隔,同步时钟,开始作业。语义明显,不多说明,后3个设置脚本如下:
--设置轮询间隔(主实例执行) EXEC msdb.dbo.sp_post_msx_operation @operation = 'SET-POLL', @object_type = 'SERVER', @specific_target_server = 'HZC\DOG', @value = 60--以秒为单位的轮询间隔(10 到 28800) GO --设置时钟同步(主实例执行) EXEC msdb.dbo.sp_post_msx_operation @operation = 'SYNC-TIME', @object_type = 'SERVER', @specific_target_server = 'HZC\DOG' GO --设置开始同步(主实例执行) EXEC msdb.dbo.sp_post_msx_operation @operation = 'RE-ENLIST', @object_type = 'SERVER', @specific_target_server = 'HZC\DOG' GO
脱离 最后再说。作业可能较久没同步或者变化较多,可以批量重新同步。存储过程 sp_resync_targetserver 先是同步一个删除命令,删除所有作业,再将所有目标服务器作业同步过来。
--重新同步指定目标服务器中的所有多服务器作业(主实例执行) EXEC msdb.dbo.sp_resync_targetserver N'ALL' GO
同步指令下达之后,就等着时间轮询到时执行同步。轮询时间可以设置,也可强制轮询。
(注:该存储过程似乎没用,最好在操作界面点击 “强制轮询”)
--强制轮询,手动脚本似乎无效!(主实例执行) DECLARE @localtime VARCHAR(30) = CONVERT(VARCHAR(30),GETDATE(),120) EXEC msdb.dbo.sp_sqlagent_probe_msx @server_name = N'HZC\DOG', @local_time = @localtime, @poll_interval = 60, @time_zone_adjustment = 480 GO
对于脱离,几个方法:
--从多服务器操作中删除当前服务器,并删除目标服务器中的作业(目标实例执行,为最后一个作业则会删除 MSX&TSX) EXEC msdb.dbo.sp_msx_defect @forced_defection = 0 GO --从多服务器操作中删除当前服务器,并删除目标服务器中的作业(主/目标实例执行,为最后一个作业则会删除 MSX&TSX) EXEC msdb.dbo.sp_post_msx_operation @operation = 'DEFECT', @object_type = 'SERVER', @specific_target_server = 'HZC\DOG' GO --删除作业目标服务器,并删除目标服务器中的作业(主实例执行,为最后一个作业则会删除 MSX&TSX) EXEC msdb.dbo.sp_delete_targetserver @server_name = 'HZC\DOG', @clear_downloadlist = 1 ,--是否清除下载列表 @post_defection = 1 --是否向目标服务器发布脱离指令 GO
参考:企业范围的自动化管理