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

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

我们有一个 SQL 2000 DB。服务器因 Raid 阵列故障而崩溃。现在当我们运行 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 列的唯一 constarint 创建,因此我们尝试删除并重新创建该索引。这导致以下错误:

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 DB 并重命名刚刚恢复的 DB 使其成为 prod
  • 启动生产应用程序

有人能在这个方法上找出漏洞吗?也许,建议一种不同的方法?我们需要的是最少的停机时间。

SQL 2000 DB 大小 94 GB 包含损坏页面的表包含 4.6 亿多行数据

谢谢您的帮助。

拉吉

答案1

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

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

有时,您可以通过执行以下操作来创建受影响表的精确副本

select *
into NewTableFromOld
from DamagedTable

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

答案2

我会尝试先将数据批量添加到文件中,然后再将其批量添加到新表中。对于那么多的记录,SELECT INTO 并不合适(在我看来)...

相关内容