修复数据库中不一致的页面

我们有一个SQL 2000数据库。 服务器由于RAIDarrays故障而崩溃。 现在当我们运行DBCC CHECKDB时,我们得到一个错误,在9个页面中有27个一致性错误。

当我们在这些页面上运行DBCC PAGE时,我们得到这个:

Msg 8939, Level 16, State 106, Line 1 Table error: Object ID 1397580017, index ID 2, page (1:8404521). Test (m_freeCnt == freeCnt) failed. Values are 2 and 19. Msg 8939, Level 16, State 108, Line 1 Table error: Object ID 1397580017, index ID 2, page (1:8404521). Test (emptySlotCnt == 0) failed. Values are 1 and 0. 

由于指定索引是非聚集的,并且由包含2列的唯一常量创build,因此我们尝试删除并重新创build索引。 这导致了以下错误:

 CREATE UNIQUE INDEX terminated because a duplicate key was found for index ID 2. Most significant primary key is '3280'. The statement has been terminated. 

然而运行

 Select var_id,result_on from tests group by var_id,result_on having count(*)>1 

返回0行。

以下是我们计划要做的事情:

  • 还原服务器的预服务器崩溃副本并运行DBCC CHECKDB
  • 如果返回干净,然后再次恢复而不恢复
  • 应用所有次要的TLOG备份
  • 停止生产应用程序,采取尾部日志备份,也适用于此
  • 删除prod数据库并重命名新鲜恢复的数据库,使其生产
  • 开始prod应用程序

有人可以在这个方法打孔吗? 也许,build议一个不同的方法? 我们需要的是最less的停机时间。

SQL 2000数据库大小94 GB具有损坏页面的表有460多亿行数据

谢谢您的帮助。

拉吉

您的恢复解决scheme是继续进行教科书的方式。 假设您有适当的备份,并且您可以备份损坏数据库的事务日志,那么您的策略就是要实施的教科书。

在继续之前,您是否考虑过重新创build受影响的表格的可能性?

有时你可以通过做一个创build一个受影响的表的确切副本

 select * into NewTableFromOld from DamagedTable 

然后,只需删除/交换与新的损坏的表,记住添加适当的约束和索引。

我会尝试将数据填充到文件中,然后将其批量恢复到新表中。 SELECT INTO不适用于该logging数(IMO)…