首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 資料庫崩潰災難復原完整流程:從附加資料檔到緊急模式重建記錄

     編輯:關於SqlServer

理想情況:資料與記錄檔完好

  • 使用 sp_attach_db 附加資料檔 (MDF/LDF) 至新執行個體。
  • 或停機複製所有檔案 (含 master) 至原路徑啟動服務 (不建議,sp_attach_db 較乾淨)。

常見情況:記錄檔損毀或遺失

崩潰時未完成交易與髒頁未寫入磁碟,sp_attach_db 會失敗。依賴 DBA 災難復原計畫:還原完整備份 → 差異備份 → 記錄備份 → 若作用中記錄檔可讀,還原至崩潰前狀態。

最糟情況:無可用備份、記錄檔不可用、資料檔尚存

  1. 嘗試單一檔案附加:
    EXEC sp_attach_single_file_db @dbname='DBName', @physname='Path\DBName.mdf'
    若資料庫剛好執行過 CHECKPOINT,可能成功。
  2. 緊急模式重建記錄檔 (最後手段):
    1. 允許系統表更新:
      USE master; GO
      EXEC sp_configure 'allow updates', 1; RECONFIGURE WITH OVERRIDE; GO
    2. 設定資料庫狀態為 32768 (EMERGENCY MODE):
      UPDATE sysdatabases SET status = 32768 WHERE name = 'DBName'; GO
    3. 重啟 SQL Server 服務,系統會嘗試重建記錄檔 (通常成功)。
    4. 重啟後檢查資料庫:設定單一使用者模式並執行 DBCC CHECKDB:
      EXEC sp_dboption 'DBName', 'single user', 'true';
      DBCC CHECKDB('DBName');
    5. 若 CHECKDB 回報錯誤,依序嘗試修復選項 (最後可能需 REPAIR_ALLOW_DATA_LOSS)。
    6. 對每個資料表執行 DBCC CHECKTABLE (從 sysobjects 篩選 IsTable=1)。
    7. 仍有錯誤嘗試 SELECT INTO 複製資料至新資料表驗證。
    8. 重建所有索引、檢視、預存程序、觸發器 (DBCC DBREINDEX 可協助)。
    9. 恢復資料庫狀態並關閉系統表更新:
      UPDATE sysdatabases SET status = 28 WHERE name = 'DBName';  -- 或使用 sp_resetstatus
      EXEC sp_configure 'allow updates', 0; RECONFIGURE WITH OVERRIDE; GO

關鍵提醒

  • 進行中的交易必定遺失,原有資料可能受損。
  • 所有操作均有官方文件 (Books Online) 詳細說明,請參閱對應版本文件。
  • 預防勝於治療:建立完整備份策略、定期驗證還原、監控硬體健康狀態。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved