在实例之间抵消SQL Server代理作业计划的开始时间

时间:2013-08-28 17:37:57

标签: sql-server job-scheduling sql-server-agent sql-agent-job

我将代理作业设置为从凌晨2:00到晚上11:59每隔两小时运行一次日志备份(留下运行完整备份或差异备份的窗口)。在我的50个左右的每个实例中都设置了类似的工作。我可能会随着时间的推移添加几百个实例(我们为一些客户托管SQL Server)。它们都备份到相同的SAN磁盘卷。这会导致延迟问题,从而影响性能。

我想将每个实例的作业运行时间偏移5分钟,以便实例1在2:00,4:00等运行作业,实例2将在2:05运行它, 4:05等,实例3将在2:10,4:10等运行,依此类推。如果我在每个实例上偏移作业的开始时间(例如2:2,例如2:2:2,例如2:2,等等),我是否可以合理地期望我得到我想要的结果没有所有实例同时运行这个工作?

2 个答案:

答案 0 :(得分:1)

如果这是我们刚刚在Twitter上进行的对话:当您告诉SQL Server代理每n分钟或每n小时运行一次时,下一次运行基于 start 时间,而不是完成时间。因此,如果您将实例1上的作业设置为2:00运行并且每2小时运行一次,则第2次运行将在4:00运行,无论第一次运行是否需要1分钟,12分钟,45分钟等等。

有一些警告:

  • 由于内部代理同步可能会有轻微的延迟,但我从未见过这种情况超过几秒
  • 如果第一次在2:00运行更多超过2小时(但不到4小时),则下次运行的时间将是6:00(4:00运行是跳过,它不会在4:10或4:20运行到"赶上")

还有另一个建议是添加一个WAITFOR来抵消开始时间(我们应该丢弃随机的WAITFOR,因为那可能不是你想要的 - 随机<> unique)。如果你想在每个实例(1分钟,2分钟等)上硬编码不同的延迟,那么使用日程安排比通过为所有作业添加步骤更直接。 IMHO。

答案 1 :(得分:0)

也许您可以设置一个管理“计划”的集中式数据库,并让作业在运行时添加/更新一行。这样,每个后续服务器都可以启动可以启动的“轮询”作业。这样,作业中的任何延迟都会导致其他人等待,这样当其中一个服务器被甩掉时,您的计时时间就不会有差异。

作为一个有点偏执的人,我会添加一个笼统的场景,表示在等待“x”分钟之后,无论如何都要延迟,以至于延迟不能足够远,以至于作业无法运行。