我的目标是将备份作业中的错误捕获到监控表中。
问题是,有些情况下备份语句返回多个错误,因此 ERROR_MESSAGE() 是不够的:
消息 3201,级别 16,状态 1,第 1 行无法打开备份设备“...”操作系统错误 3(系统找不到指定的路径。)。
消息 3013,级别 16,状态 1,第 1 行备份数据库异常终止。
我可以使用 throw 来捕获这两条消息,但是有没有一种简单的方法可以将 throw 输出插入到表中或以另一种方式克服这个问题?
我的目标是将备份作业中的错误捕获到监控表中。
问题是,有些情况下备份语句返回多个错误,因此 ERROR_MESSAGE() 是不够的:
消息 3201,级别 16,状态 1,第 1 行无法打开备份设备“...”操作系统错误 3(系统找不到指定的路径。)。
消息 3013,级别 16,状态 1,第 1 行备份数据库异常终止。
我可以使用 throw 来捕获这两条消息,但是有没有一种简单的方法可以将 throw 输出插入到表中或以另一种方式克服这个问题?
您可以使用扩展事件来增强错误处理,以克服您遇到的 TRY...CATCH 缺点。设计模式涉及以下步骤:
sqlserver.error_reported
主要由 SPID 过滤的事件。TRY
在块中执行语句。CATCH
,读取 XEvents 会话数据。这是一个可以从 SSMS 以单批次手动运行的示例。只需确保将脚本中所有出现的“2016”替换为您的 SPID。
运行脚本后,您的 SSMS 输出应类似于以下内容:
那里有很多活动部件。但你也许可以让它为你工作。我写了一些关于 TRY...CATCH 的相关博客文章,可能会有所帮助:
TRY...CATCH 未兑现的承诺
使用扩展事件增强 T-SQL 错误处理
第 2 部分:使用扩展事件增强 T-SQL 错误处理
在用于使用备份设备备份数据库的 SQL 代理作业中,无论失败还是成功,只要让每个步骤都进入下一步。但是,在最后一步中包含以下逻辑,并告诉它在失败时报告失败并在成功时报告成功。
这将通过电子邮件将来自该作业的 msdb 表中的失败详细信息通过电子邮件发送给您,正如您在 SQL 代理作业历史记录区域中看到的当前日期记录一样。您也可以在收到电子邮件通知时手动检查 SQL 代理历史记录,但这非常适合我设置它的需要。
我相信您也可以使用该逻辑并进行一些更改以进一步满足您的需求。在我的情况下,备份设备的每个备份作业都是它自己的单独步骤,无论结果如何,每个步骤都进入下一步,最后一步正如我上面指出的那样,足以进行故障监控。
如果我不在办公室或通过 VPN 连接,通过电子邮件发送的 HTML 表格数据将让我知道这是否需要注意等等检查 Outlook Web 邮件。
带有 spid 句柄的 DMason 查询: