錯誤現象
Msg 8928, Level 16, State 1: Page (1:94299) could not be processed.
Msg 8939: Test (IS_OFF (BUF_IOERR, pBUF->bstat)) failed.
CHECKDB found 2 consistency errors in table 'yourtable'.
repair_allow_data_loss is the minimum repair level.
處理流程
- 定位損壞物件:Object ID → 表名,Page ID → 檔案:頁碼。
- 判斷頁面類型:
DBCC TRACEON(3604,-1);
DBCC PAGE('yourdb', 1, 94299, 3);
-- Metadata: IndexId = n
-- 0=Heap, 1=Clustered Index, >1=Nonclustered Index
- 非叢集索引頁損壞:直接
DROP INDEX 重建,零資料遺失。
- Heap/叢集索引頁損壞:需頁面級還原(Enterprise/Developer 版支援線上還原,Standard 需離線)。
頁面級還原步驟(完整備份 + 差異 + 日誌鏈完整)
-- a. 立即備份尾部日誌
BACKUP LOG yourdb TO DISK='D:\DBBak\yourdb_a.trn';
-- b. 從完整備份還原指定頁面
RESTORE DATABASE yourdb PAGE='1:94299' FROM DISK='D:\DBBak\yourdb.bak' WITH NORECOVERY;
-- c. 還原差異備份(若有)
RESTORE DATABASE yourdb FROM DISK='D:\DBBak\yourdb.dif' WITH NORECOVERY;
-- d. 依序還原後續所有日誌備份
RESTORE LOG yourdb FROM DISK='D:\DBBak\yourdb_1.trn' WITH NORECOVERY;
RESTORE LOG yourdb FROM DISK='D:\DBBak\yourdb_2.trn' WITH NORECOVERY;
RESTORE LOG yourdb FROM DISK='D:\DBBak\yourdb_a.trn' WITH NORECOVERY;
-- e. 再次備份尾部日誌
BACKUP LOG yourdb TO DISK='D:\DBBak\yourdb_e.trn';
-- f. 還原最後尾部日誌並恢復
RESTORE LOG yourdb FROM DISK='D:\DBBak\yourdb_e.trn' WITH RECOVERY;
事後驗證
SELECT OBJECT_NAME(2088535921); -- 取得表名
DBCC CHECKTABLE('yourtable');
DBCC CHECKDB('yourdb');
核心原則
- 備份策略是前提:完整模式、定期全備+日誌、異地存放。
REPAIR_ALLOW_DATA_LOSS 為最後手段,會釋放損壞頁導致資料遺失。
- 非叢集索引/LOB 頁損壞用
REPAIR_ALLOW_DATA_LOSS 不會遺失資料。
- 冷靜分析、Google 英文錯誤碼、修復前再備份一次。