首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SQL Server 頁面損壞/校驗和錯誤:分級修復與頁面級還原實戰

     編輯:MySQL 資料庫相關知識

錯誤現象

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.

處理流程

  1. 定位損壞物件:Object ID → 表名,Page ID → 檔案:頁碼。
  2. 判斷頁面類型:
    DBCC TRACEON(3604,-1);
    DBCC PAGE('yourdb', 1, 94299, 3);
    -- Metadata: IndexId = n
    -- 0=Heap, 1=Clustered Index, >1=Nonclustered Index
  3. 非叢集索引頁損壞:直接 DROP INDEX 重建,零資料遺失。
  4. 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 英文錯誤碼、修復前再備份一次。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved