我们有一个 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.
Run Code Online (Sandbox Code Playgroud)
由于指示的索引是非聚集的,并且是由包含 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.
Run Code Online (Sandbox Code Playgroud)
然而运行
Select var_id,result_on
from tests
group by var_id,result_on
having count(*)>1
Run Code Online (Sandbox Code Playgroud)
返回 0 行。
这是我们计划做的事情:
有人可以在这种方法中打孔吗?也许,建议一种不同的方法?我们需要的是最短的停机时间。
SQL 2000 数据库大小 94 GB 有损坏页的表有 4.6 亿多行数据
谢谢您的帮助。
拉吉
您的恢复解决方案是继续进行的教科书方式。假设您有适当的备份,并且可以备份损坏数据库的事务日志,那么您的策略就是教科书上要实施的策略。
但是,在继续之前,您是否考虑过仅重新创建受影响的表的可能性?
有时,您可以通过执行以下操作来创建受影响表的精确副本:
select *
into NewTableFromOld
from DamagedTable
Run Code Online (Sandbox Code Playgroud)
然后只需删除/用新表交换损坏的表,记住添加适当的约束和索引。
| 归档时间: |
|
| 查看次数: |
972 次 |
| 最近记录: |