Sql Server - 在多台服务器上运行作业

use*_*655 4 sql-server-2008

我正在使用 SqlServer 2008。

如果空间小于 15%,我有一个 Sql Server 作业检查磁盘空间和电子邮件管理员

是否可以在所有服务器上运行该作业,而不是将该作业添加到所有服务器?

(我将这些服务器添加为链接服务器)

Sol*_*zky 8

要回答在多台服务器上运行 SQL 代理作业的具体问题(绝对是个好问题),并且暂时忽略您希望该作业执行的特定操作(这可能是另一个问题):

SQL Server / SQL Server 代理实际上附带了一个工具,可以让这种类型的事情变得非常简单:多服务器管理。您设置了一个主 (MSX) 和多个目标 (TSX) 服务器。然后您只在主服务器上创建作业,然后选择它应该在哪个目标服务器上运行。

请参阅 MSDN 页面的部分,从跨企业的自动管理开始。

它实际上很不错。我在一个有 50 个(至少)产品实例的地方工作,外加 5 个其他环境(开发、QA 等),每个环境有 12 - 30 个实例。许多 SQL 代理作业,主要通过 MSX/TSX 进行管理。

您仍然可以在任何特定实例的本地创建作业。例如,当将数据从大表迁移到新结构时(一个预发布任务,用于最大限度地减少停机时间,以便在发布期间只需要交换表),在发布前大约 1 周我将创建新表和本地作业每隔几分钟迁移 1k - 4k 行的批次。将它们创建为本地而不是 MSX 允许:

  • 为每个节点设置不同的批次大小和计划:我们有 20 个节点,其中一些节点要么比其他节点大一点,要么可能小一点。不同的批量大小对不同的数据量效果更好。同样,随着在具有较大表的节点上工作的作业可能完成 30% 或某事,它们开始变慢,需要对批处理大小和/或调度频率进行细微更改。MSX(没有大CASE @@SERVERNAME语句)不可能为每个 Target/TSX 服务器定制作业细节。
  • 自动清理:这些作业的本质是临时的,一旦节点上的所有数据都已迁移,该特定作业就没有更多用途,因为可以通过 INSERT、UPDATE、DELETE 触发器处理新行使已经迁移的行保持同步。因此,一旦作业检测到 0 行被移动,它就会查找自己的行JobID并调用[msdb].dbo.sp_delete_job删除自身。这样做意味着我们没有运行没有做任何工作的作业,而且我们不必担心发布期间或发布后的作业清理。我认为 MSX / TSX 不可能做到这一点,因为我认为 TSX 服务器无法将其 MSX 作业之一除名。当然,sp_delete_job的文档并没有说不能,我也没试过。

并且任何 MSX / TSX 通信都不需要链接服务器。事实上,出于测试目的,在将 MSX 服务器的备份恢复到另一台服务器时应该小心。我用我们的产品 MSX 服务器做了一次,并开始删除一些目标服务器元数据,因为它使我试图测试的内容变得混乱。几个小时后,首席 DBA 发出了一条紧急消息,询问谁在干扰生产中的工作,因为相当多的工作被神秘地从他们的部分/大部分/全部 TSX 服务器中除名。我只是碰巧我用于测试的服务器由于过时的技术原因位于生产网络内,并且被允许与 TSX 节点进行通信。哎呀;-)。不用说,

为明确行为,当您选择目标服务器时,作业及其相关数据(步骤、计划等)将复制到该 TSX 服务器。因此,这项工作将生活在目标服务器上,并通过SQL代理运行该目标服务器上; 作业在主服务器上运行。

如果您想知道 中的[originating_server_id]字段是什么[msdb].dbo.sysjobs,它指的是 Master/MSX 服务器(我相信值0意味着“本地”作业)。

SELECT * FROM [msdb].dbo.sysjobs -- originating_server_id
Run Code Online (Sandbox Code Playgroud)

还:

-- map of jobs and what Target/TSX servers they are on
SELECT * FROM [msdb].dbo.sysjobservers 

-- registered TSX servers
SELECT * FROM [msdb].dbo.systargetservers 
Run Code Online (Sandbox Code Playgroud)

这是SQL Server 代理表的完整列表