我收到通知,我们的一台服务器(Win Enterprise 2008 Cluster 上的 SQL Server 2008 Cluster)对所有数据库的 DBCC CHECKDB 在过去四次运行中均失败。我们之前没有任何数据,但看起来它已经有一段时间没有成功了。日志文件中没有错误:
DBCC results for 'sys.sysxmlfacet'. [SQLSTATE 01000]
Msg 0, Sev 0, State 1: Unspecified error occurred on SQL Server. Connection may have been terminated by the server. [SQLSTATE HY000]
There are 112 rows in 1 pages for object "sys.sysxmlfacet". [SQLSTATE 01000]
我使用 sp_MSForEachDB 运行了 DBCC CHECKDB 以获得更准确的结果,并在同一个数据库上但在不同的点出现了相同的错误:
DBCC results for 'NameValuePair_Greek_CI_AS'. [SQLSTATE 01000]
Msg 0, Sev 0, State 1: Unspecified error occurred on SQL Server. Connection may have been terminated by the server. [SQLSTATE HY000]
There are 0 rows in 0 pages for object "NameValuePair_Greek_CI_AS". [SQLSTATE 01000]
此外,错误日志指出 DBCC 对于该数据库而言已完成且没有错误。
我不知道如何追踪这个模糊问题,它只发生在这个服务器上的几十个数据库中。任何帮助都非常感谢!
编辑以回答评论:
它正在通过 SQL Server Agent 在本地运行。我们认为唯一可能的原因是,由于它位于 Win2008 群集上,因此它可能正在进行故障转移,因为数据库现在太大(880GB,但没有在相同硬件/软件上运行相同作业的许多其他数据库那么大),但我们没有任何迹象表明正在发生故障转移,从而消除了连接问题。故障转移通常会发出如此多的标志和警告,很难错过。拆分数据库可能是我们的下一个故障排除措施,但在此之前,我们只是想了解为什么这个作业运行得如此奇怪。
答案1
如果错误日志表明 CHECKDB 已完成,那么它就完成了 - 这是 CHECKDB 退出前所做的最后一件事。
这看起来像是打印结果时客户端出现的问题。当我在 SQL Server 2005 开发期间编写 DBCC CHECKDB 时,有时会出现各种客户端的奇怪问题,具体取决于输出的行数 - 例如,SSMS 只会打印来自 CHECKDB 的前 1000 个错误,否则会耗尽内存
可以尝试以下几件事:
- 使用 WITH ALL_ERRORMSGS, NO_INFOMSGS 运行(这是我始终建议人们运行它的方式)
使用 sqlcmd 而不是 SSMS 运行它
从 SQLCMD 运行它并使用 SQLCMD -o 开关将结果传输到文件
谢谢