当我运行时DBCC CHECKDB
,我会收到大量这样的错误消息:
表错误:对象 ID 2020918271,索引 ID 1,分区 ID 72057594196590592,分配单元 ID 72057594190233600(行内数据类型),页面 (4:129574),行 0。记录检查(有效的 UDT 列)失败。值为 3 和 0。
现在我只是想了解这个错误的含义以及它的严重程度——它似乎是一些与校验和相关的错误,可能没有那么严重。最近的备份似乎也有同样的问题,但无论哪种方式都不是什么大问题,因为可以从其他来源重新创建数据。
无论如何,我正试图深入了解这一点,也许了解哪些行已损坏,如果有任何特定的模式。当我跑去DBCC PAGE
看里面有什么的时候,比如下面的语句:
DBCC PAGE('MyDB', 4, 129574, 3)
它什么也没显示。纳达。压缩。只是标准:
DBCC 执行完成。如果 DBCC 打印错误消息,请联系您的系统管理员。
但没有错误,也没有页面数据。事实上,出现的每一个错误CHECKTABLE
都有一个文件/页码,我从PAGE
.
我还从CHECKTABLE
输出中看到以下错误,但只是偶尔出现:
表错误:对象 ID 2020918271,索引 ID 1,分区 ID 72057594196590592,分配单元 ID 72057594190233600(键入行内数据)。页面 (4:129575) 未在扫描中看到,尽管其父级 (4:129977) 和上一个 (4:129574) 引用了它。检查任何以前的错误。
看起来它可能是相关的,但我不确定如何。UDT 可能相对较大(大约 5 KB),所以它可能是跨页面拆分的,并且其中一个页面丢失了?不过,这只是一个疯狂的猜测。
出来的错误数量CHECKTABLE
也让整个表格看起来都是这样,但我知道不是这样,因为我可以很好地读取数据。事实上,有一个每天运行的自动化过程,随着时间的推移,它会读取该表中的几乎所有数据,并且没有报告任何错误。此外,如果我DBCC PAGE
在其中一个父页面(确实存在,即使“以前的”页面不存在)上运行,我可以获得键列,并且我可以SELECT
获取所有周围键的所有数据而不会出现任何错误。
谁能告诉我这里发生了什么?DBCC CHECKTABLE
当所引用的页面甚至不存在时给我这些错误是否有意义?它CHECKTABLE
本身是否有可能发出虚假错误?
你打开跟踪标志了
DBCC TRACEON(3604)
吗?否则 oll DBCC PAGE 输出仅进入错误日志。