我正在维护 MS SQL 15.0 (2019) 服务器,其中包括每晚备份数据库。我有一个维护计划,由 SQL 服务器代理在每晚午夜后运行,负责处理备份,并且运行良好。
然而,昨晚服务器停机了大约 20 分钟,所以当计划应该运行时它却关闭了,而我没有昨晚的夜间备份。
如果在计划应该运行时服务器被关闭,是否有任何方法可以配置维护计划,使其在服务器启动时运行?
答案1
由于我对 T-SQL 缺乏了解,我个人使用 PowerShell 模块数据库工具以此目的。
虽然我已经在 SQL 服务器上运行了这个简单的命令,但您也可以使用 MSSQL 代理或甚至使用“启动时”计划的任务计划程序来安排它:
$jobname = "BackupJobName"
$interval = 24 ##in hours
if((Get-DbaAgentJob -SqlInstance localhost\MSSQLSERVER -Job $jobname).LastRunDate -le (Get-Date).addHours(-$interval)){
write-host "Job did not run, will restart"
Start-DbaAgentJob -SqlInstance localhost\MSSQLSERVER -Job $jobname} else {
write-host "Job did run, no action required"}
解释:基本上我只是将上次运行时间与当前日期/时间减去作业间隔时间(您必须手动输入)进行比较。不是很先进,但很简单,可以完成工作。
我还没有在生产中使用过它。如果你打算这样做,你可能需要做一些测试来检测意外行为。
答案2
您可以为该作业添加一个时间表,其频率为“启动时”,并以某种方式为该作业添加逻辑,以表示“如果上次备份早于某个阈值(例如 20 小时),则继续。否则,正常退出”。这里的想法是,由于该作业也将按照常规的每日时间表执行,因此相同的逻辑也需要在那里起作用。
在正常运行时,作业将启动并显示“自上次备份以来已过去约 24 小时,继续”。如果您正在经历维护期并且服务器在 01:00 启动,它将显示“自上次备份以来已过去约 25 小时,继续”。但如果服务器在 12:00 意外重启,它将显示“自上次备份以来仅过去约 12 小时,我无事可做”。