已从我们的 SQL Server 数据库之一收到以下错误消息:
SQL Server 检测到基于逻辑一致性的 I/O 错误:校验和不正确(预期:0x6847f47b;实际:0x15160a19)。它发生在读取文件“C:\XYZ.MDF”中偏移量 0x000001c832e000 的数据库 ID 5 中的页面 (1:934295) 期间。SQL Server 错误日志或系统事件日志中的其他消息可能会提供更多详细信息。这是威胁数据库完整性的严重错误情况,必须立即纠正。完成完整的数据库一致性检查 (DBCC CHECKDB)。这个错误可能是由许多因素引起的;有关详细信息,请参阅 SQL Server 联机丛书。
显然我必须DBCC CHECKDB
在损坏的数据库上运行。在此之前,我试图找出数据库名称是什么(使用数据库 ID)以及错误与什么对象相关,使用错误消息中给出的页码。
所以我知道数据库名是distribution
,表名是MSrepl_errors
。
我对 SQL Server 复制功能不太熟悉,因此如果有人可以帮助我解决以下问题,我将不胜感激:
为了调查和/或可能解决问题,我必须先执行
DBCC CHECKDB
;但是,CHECKDB
如果不先将数据库置于单用户模式,就无法运行,这是正确的吗?distribution
关于数据库不被最终用户使用的事实,我是否仍然必须将其置于单用户模式?如果是,对复制作业有什么影响?
为了运行 checkdb,它不需要在单个用户中。你可以跑
DBCC CHECKDB('distribution') WITH NO_INFOMSGS, ALL_ERRORMSGS
过去看看。由于我们不知道当前问题在哪里,因此很难说对当前拓扑会产生什么影响/是否有任何影响。我们真的需要了解更多信息,请随时使用来自
CHECKDB
.请注意,系统数据库(被认为是分发数据库)不支持在
REPAIR_ALLOW_DATA_LOSS
其上运行。事实上,它应该只在最具破坏性的情况下和胁迫下运行。选择对系统数据库执行此操作将立即成为不受支持的配置。MSrepl_errors 表包含运行复制时发生并由代理报告的错误。尝试运行 dbcc 检查并查看错误信息。当页面将被修复并且它不是主要问题时,修复数据库将从该表中删除数据。其余表不应受到影响。我建议首先检查错误信息,然后运行修复命令使 db 联机。
当数据库联机时,启动代理并验证代理报告的任何错误。尝试使用复制监视器获取更多信息。