SqlServer作业指定目标服务器

  用SSMS生成数据库作业的创建脚本的时候,有一步是sp_add_jobserver操作:

EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'

  之前没注意过这个细节。昨天看到网上有人提问,为什么前面已经调用存储过程sp_add_job创建作业了,后面还多此一举添加到服务器呢。我自己试了一下,把这块总结下。

 一、作业目标为本地服务器

  如果只调用sp_add_job创建作业,这时候作业能在SSMS对象资源管理器中的作业列表中显示,但无法执行,执行的时候会报如下错误:

无法启动作业 "XXX" (ID XXXX-XXXX-XXXX-XXXX-XXXXXXX),因为该作业未定义作业服务器。请通过调用 sp_add_jobserver 将该作业与作业服务器关联起来。

  查看作业属性页的“目标”选项卡,发现没有选中服务器。这也是sp_add_jobserver存储过程干的事。

  作业属性-目标

  一般的作业,都选中了“目标为本地服务器”。如果想指定多台服务器,可以通过下面操作实现。

  二、作业目标为多台服务器

  首先指定一台服务器为主服务器,然后向这台服务器添加目标服务器,这样,目标服务器就会出现在上图中的列表框中,并可以被选中。当一个作业指定了目标服务器后,作业在主服务器上执行的时候,会向目标服务器发送指令,目标服务器下载作业,然后执行,最后将执行结果告诉主服务器。

  在设置数据库之前,需要修改主服务器的注册表中的HKEY_LOCAL_MACHINESOFTWAREMicrosoftMicrosoft SQL ServerMSSQL13.MSSQLSERVERSQLServerAgent下的AllowDownloadedJobsToMatchProxyName值,默认值是0,改成1,允许从主服务器下载作业。并修改目标服务器上HKEY_LOCAL_MACHINESOFTWAREMicrosoftMicrosoft SQL ServerMSSQL13.MSSQLSERVERSQLServerAgent下的MsxEncryptChannelOptions值。这个值的意思在MSDN中有解释:Set Encryption Options on Target Servers。默认值是2,加密且需要证书,0是禁用加密。上述路径根据数据库版本和实例不同会不一样。

  现有两台服务器22.11.95.165和22.11.95.164,选择165作为主服务器,在“SQL Server代理”上右键-多服务器管理-将其设置为主服务器

  

  弹出主服务器向导,跳过前面的页,进入“目标服务器”设置页面,点击“添加链接”,连接164服务器,如下所示:

  

  然后下一步直到完成。如果出现错误“目标服务器无法与主服务xxxx建立加密连接。请确保目标服务器上的MsxEncryptChannelOptions注册表子项设置正确无误”,则检查上述注册表项修改是否正确,如果还有问题,就把两台服务器的MsxEncryptChannelOptions和AllowDownloadedJobsToMatchProxyName都修改掉。注册表值不正确,还会影响后续拆离操作。

  

  执行成功后,刷新SSMS中的"SQL Server Agent",会发现主服务器后面多了(MSX),“作业”分支下面多了“本地作业”和“多服务器作业”两个目录。目标服务器后面多了(TSX:22.11.95.165)

  

  这时,再选中主服务器上的一个作业,查看属性-目标选项卡,就可以看到可以选择22.11.95.164作为目标服务器了

  

  查看作业列表,刚才选择的作业进入到了“多服务器作业”目录。  

  然后查看目标服务器状态

  

  

  显示INSERT操作已经被目标服务器下载下来了。这时查看目标服务器,这个作业已经存在了。

   

   如果要删除这种多服务器方式,只要在刚才目标服务器的管理界面上,点击“发布指令”,指令类型选择“脱离”就可以了。

  

  稍等一会儿,服务器就脱离成功。两台服务器都回到了添加之前的样子。还要记得将刚才的作业修改成目标是本地服务器,否则无法执行。

原文地址:https://www.cnblogs.com/wangguanguo/p/8371713.html