DBCC CHECKDB:表错误:对象ID 0,索引ID -1,分区ID 0,分配单元ID

时间:2016-10-05 12:53:38

标签: sql-server

是的我知道最好的选择是恢复未损坏的数据库。

但是... 以下消息是否表示未使用的页面中存在数据损坏?

  

表错误:对象ID 0,索引ID -1,分区ID 0,分配单元ID -8573858375060684800(类型未知),页面(0:13887752)。测试(IS_OFF(BUF_IOERR,pBUF-> bstat))失败。值为12716041和-14。

我有大约200个错误,如上所述。

2 个答案:

答案 0 :(得分:1)

是的,您的数据库已损坏。您粘贴的错误表明,这种损坏可能是由于I / O子系统造成的。

在此之前你需要了解什么是校验和..

  

启用校验和时,SQLServer会在写入磁盘并写入其页眉之前计算页面的校验和。

     

当再次读取页面时,它会计算校验和,如果此校验和与上次计算的CheckSum不匹配,则SQL将抛出错误

运行CHKDSK,看看I / O子系统是否与DBCC活动一样好

同一问题已被重新审核here

根据评论更新
Paul Randal解释了Objectid Zero:Finding a table name from a page ID

如果您看到ObjectId为0,则表示找不到元数据。这可能是因为:

  

由于记录了页面损坏,因此页面所属的表已被删除   系统目录在某种程度上是腐败的   页面已损坏,因此使用不正确的值来查找元数据

参考文献:
http://www.sqlskills.com/blogs/paul/inside-the-storage-engine-using-dbcc-page-and-dbcc-ind-to-find-out-if-page-splits-ever-roll-back/

答案 1 :(得分:0)

这种模式意味着 DBCC 无法确定页面属于哪个对象。

<块引用>

表错误:对象 ID 0,索引 ID -1,分区 ID 0,分配单元 ID -8573858375060684800(未知类型),页面(0:13887752)。测试 (IS_OFF (BUF_IOERR, pBUF->bstat)) 失败。值为 12716041 和 -14。

SQL Server 有一种方法可以让数据文件页成为所谓的受保护的磁盘。这实际上是一个真正的用词不当,因为它的真正含义是它允许 SQL Server 检测页面何时损坏。这只是 SQL Server 能够判断 I/O 子系统已损坏页面的一种方式。您可以打开页面保护选项或使用 ALTER DATABASE SET PAGE_VERIFY<option> 更改您拥有的选项,您可以使用三种不同的选项:

  • 第一个是 NONE,我真的不建议你这样做
  • TORN_PAGE 检测
  • 校验和

参考:https://www.stellarinfo.com/blog/detect-page-level-corruption-automatically/