我正在使用 Ola Hallengren 的维护脚本,并且遇到了一个问题,该问题似乎记录在常见问题解答中。
就上下文而言,存在必须将现有 SQL Server 备份移动到新共享的问题,因此 MSDB 中的历史记录和新备份的当前位置与现在存在的不匹配。
运行 MaintenanceSolution.sql 创建的默认作业时,“DatabaseBackup - USER_DATABASES - FULL”(对其运行的参数稍作修改)我看到作业现在失败,因为它似乎删除了它期望的文件:
EXECUTE @ReturnCode = [master].dbo.xp_delete_file 0, N'\\UNC\Path\Server\Database... Process Exit Code 1. The step failed.
在这种类型的第一个错误发生后,整个工作就会停止。
在常见问题解答https://ola.hallengren.com/frequently-asked-questions.html中,我发现以下段落解决了我认为我遇到的问题:
为什么我的工作在第一个错误后停止?
发生此问题是因为您使用的是 T-SQL 作业步骤。我建议您使用带有 sqlcmd 和 -b 选项的 CmdExec 作业步骤。然后作业将在出错后继续。
您可以使用 MaintenanceSolution.sql 脚本来创建作业。
我仔细检查了(因为我认为这是解决方案配置的默认值)并根据我在 SSMS 中看到的内容(类型:操作系统(CmdExec)),发现确实如此。
我还验证了该作业也使用了 -b 选项:
sqlcmd -E -S $(ESCAPE_SQUOTE(SRVR)) -d master -Q "EXECUTE [dbo].[DatabaseBackup] @Databases = 'USER_DATABASES', @Directory = N'\\UNC\Path\', @BackupType = 'FULL', @Verify = 'N', @CleanupTime = 750 , @CheckSum = 'Y', @LogToTable = 'Y'" -b
我正在快速运行存储过程,发现它只是将 xp_delete 命令中的任何错误分配给一个变量并将其作为错误引发(完全是标准 sql),那么在不修改他的解决方案的情况下是否缺少任何东西来完成这项工作?
谢谢!
在进一步挖掘(并且几乎通过电子邮件发送 Ola)后,我找到了我困惑的根源。
查询 CommandLog 表 (@LogToTable = 'Y') 后发现,当 TSQL 作业步骤报告错误时,作业实际上已完成,将命令记录到表中成功(当然文件存在于磁盘上。)
看起来不仅 TSQL 作业步骤停止报告第一个错误,该错误在常见问题解答的不同部分中引用。
如果您看到 SQL Server 代理历史记录报告失败的作业,请验证 master.dbo.CommandLog 表中是否报告了相同的失败,并确保您指定了 @LogToTable = 'Y'。
Ola 的工作表现如常见问题解答中所述,对 TSQL 工作步骤的引用是我需要的提示。