为什么DBCC CHECKTABLE在不存在的页面上报告错误?

当我运行DBCC CHECKDB ,出现如下所示的错误消息:

表错误:对象ID 2020918271,索引ID 1,分区ID 72057594196590592,分配单元ID 72057594190233600(types行内数据),页面(4:129574),行0.logging检查(有效的UDT列)失败。 值是3和0。

现在我只是想了解这个错误什么意思 ,它是多么严重 – 似乎是一些校验和相关的错误,可能不是那么严重。 最近的备份似乎也有同样的问题,但这不是什么大不了的,因为数据可以从其他来源重新创build。

无论如何,我试图深入到底,也许了解哪些行已损坏,如果有任何特定的模式。 当我运行DBCC PAGE查看那里有什么,如下面的语句:

 DBCC PAGE('MyDB', 4, 129574, 3) 

它什么也没有显示 纳达。 压缩。 只是标准:

DBCC执行完成。 如果DBCC打印错误消息,请联系您的系统pipe理员。

但没有错误,也没有页面数据。 事实上, CHECKTABLE出来的每一个错误都有一个文件/页面号,我从PAGE得到这个输出。

我也从CHECKTABLE输出中看到以下错误,但只是偶尔发现:

表错误:对象ID 2020918271,索引ID 1,分区ID 72057594196590592,分配单元ID 72057594190233600(types行内数据)。 页(4:129575)没有在扫描中看到,虽然其父(4:129977)和以前(4:129574)提到它。 检查以前的错误。

它看起来可能是相关的,但我真的不知道如何。 UDT可能相对较大(大约5 KB),因此可能会将页面拆分并丢失其中一个页面? 虽然这只是一个疯狂的猜测。

CHECKTABLE出来的错误的数量也使得整个表看起来就像这样,但我知道情况并非如此,因为我可以很好地读取数据。 事实上,每天都有一个自动化的过程,随着时间的推移,这个过程会读取这个表中的所有数据,而且没有报告过一个错误。 另外,如果我在其中一个父页面上运行DBCC PAGE (即使“先前”页面不存在),我也可以获得键列,并且可以SELECT所有周围键的所有数据,而不会出现任何错误。

有人可以告诉我这是怎么回事? 当引用的页面不存在时, DBCC CHECKTABLE是否给了我这些错误是否合理? CHECKTABLE本身是否可能发出虚假错误?

你打开跟踪标志DBCC TRACEON(3604) ? 否则,DBCC PAGE输出只能转到错误日志。