我正在为WITH CHECKSUM
我们的日常 SQL 备份添加标志,以更好地确保数据完整性。
我肯定想知道是否曾经遇到过校验和错误,但我也不希望我的工作在半夜陷入困境;我希望它完成备份“坏”数据库,然后继续备份服务器上的其他数据库。
如果我使用BACKUP WITH CHECKSUM, CONTINUE_AFTER_ERROR
,它是否仍会抛出适当的错误(SEV 22
或Error 825
其他错误)来触发我的相关警报?或者完全CONTINUE_AFTER_ERROR
抑制这一点,如果我解析作业步骤输出,我只会知道这个问题?
我只是对其进行测试,但我没有已知CHECKSUM
不一致的数据库。
是的,它将继续并完成,这篇较早的博文中有一个示例。它还包含一个损坏的数据库文件(对于旧版本)可以使用:
https://blogs.msdn.microsoft.com/sqlserverstorageengine/2007/04/17/example-corrupt-database-to-play-with-and-some-backuprestore-things-to-try/
我认为作为 dba 模拟所有这些情况实际上非常重要,我从与客户的经验中知道,如果您必须在停机时间研究这些方法,这是有风险且耗时的。所以很感谢你的提问。这是使用 SQL 进行破坏的一种疯狂/巧妙的方法:
https://sqlblogcasts.com/blogs/tonyrogerson/archive/2007/03/10/how-to-create-a-corrupt-database-using-bulk-insert-update-and-bcp-sql-server-as- a-hex-editor.aspx
通过对Brent Ozar 的说明(我使用
SET PAGE_VERIFY CHECKSUM
而不是)稍作更改SET PAGE_VERIFY NONE
,我能够在实验室环境中创建一个带有损坏页面(因此校验和不匹配)的小型数据库,以全面测试所有可能的备份选项。这给了我问题的答案:是的,如果你做 a
BACKUP WITH CHECKSUM, CONTINUE_AFTER_ERROR
,它仍然会抛出一个错误,但那个错误不会是Error: 824, Severity: 24
,它会是Error: 3043, Severity: 16
。我目前不会对所有
Sev 16
错误发出警报(不想每次有人在查询中输入错字时都得到一个页面),所以我必须添加一个新警报,Error 3043
以便在发生此问题时得到通知。那么,我最后的收获是:如果您启用备份校验和,请确保您也对 Error 3043 发出警报。
一些额外的阅读和资源: