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

SQL Server 2000 損壞資料庫檔案完整恢復指南:備份還原、Emergency Mode、重建 Log、DBCC 修復全流程

     編輯:關於SqlServer

適用範圍

僅限使用者資料庫 (非 master、msdb、model、tempdb)。系統資料庫損壞請參考官方災難恢復文件。

情境一:有完整備份 + 可用交易記錄 (最理想)

  1. 建立測試庫 test (完整復原模式)、建表、插資料。
  2. 完整備份 → test_1.bak。
  3. 續增資料、建表。
  4. SHUTDOWN 服務 → 用十六進位編輯器破壞 test_data.mdf 模擬損壞。
  5. 啟動服務 → 資料庫標示「置疑」。
  6. 尾端記錄備份 (NO_TRUNCATE):
    BACKUP LOG test TO DISK='...test_2.bak' WITH NO_TRUNCATE;
  7. 還原完整備份 (NORECOVERY):
    RESTORE DATABASE test FROM DISK='...test_1.bak' WITH NORECOVERY;
  8. 還原尾端記錄 (RECOVERY):
    RESTORE LOG test FROM DISK='...test_2.bak' WITH RECOVERY;
  9. 驗證資料完整。

關鍵:完整備份 + 尾端記錄備份 = 零資料遺失恢復 (RPO=0)。前提是記錄檔未損壞且可存取。

情境二:無備份、資料檔存在、記錄檔遺失/損壞

步驟 1:進入 Emergency Mode (緊急模式)

USE master;
GO
sp_configure 'allow updates', 1;
RECONFIGURE WITH OVERRIDE;
GO
UPDATE sysdatabases SET status = 32768 WHERE name = 'YourDB';  -- 32768 = Emergency Mode
GO

步驟 2:重建 Log 檔

SSMS → 資料庫右鍵 → 所有工作 → 附加資料庫 → 僅選 .mdf → 確定 → 系統提示「找不到記錄檔,是否建立新的?」→ 是。

或 T-SQL:
sp_attach_single_file_db 'YourDB', 'C:\Path\YourDB_data.mdf';

步驟 3:關閉 Emergency Mode、重啟驗證


sp_configure 'allow updates', 1;
RECONFIGURE WITH OVERRIDE;
GO
UPDATE sysdatabases SET status = 28 WHERE name = 'YourDB';  -- 28 = 正常狀態 (或用 sp_resetstatus)
GO
sp_configure 'allow updates', 0;
RECONFIGURE WITH OVERRIDE;
GO
-- 重啟 SQL Server 服務

步驟 4:DBCC 檢查與修復


EXEC sp_dboption 'YourDB', 'single user', 'true';
DBCC CHECKDB('YourDB');  -- 先檢查
-- 若有錯誤,依序嘗試修復等級
DBCC CHECKDB('YourDB', REPAIR_FAST);
DBCC CHECKDB('YourDB', REPAIR_REBUILD);
DBCC CHECKDB('YourDB', REPAIR_ALLOW_DATA_LOSS);  -- 最後手段,會遺失資料

步驟 5:逐表深度檢查


SELECT name FROM sysobjects WHERE xtype = 'U' AND OBJECTPROPERTY(id, 'IsUserTable') = 1;
-- 對每個表執行
DBCC CHECKTABLE('TableName', REPAIR_ALLOW_DATA_LOSS);
-- 若仍報錯,嘗試 SELECT * INTO NewTable FROM BadTable 再檢查

步驟 6:重建索引、視圖、預存程序、觸發器


DBCC DBREINDEX('TableName');  -- 或 ALTER INDEX ALL ON TableName REBUILD;
-- 重新編譯 SP: sp_recompile 'ProcName';

Zach 經驗腳本 (置疑資料庫快速重置)


USE master;
sp_configure 'allow updates', 1; RECONFIGURE WITH OVERRIDE;
UPDATE master..sysdatabases SET status = status ^ 256 WHERE name = 'DB_Name';  -- 移除 Suspect 旗標
EXEC sp_resetstatus 'DB_Name';
-- 此處建議重啟 MSDTC 服務
sp_configure 'allow updates', 0; RECONFIGURE WITH OVERRIDE;

常見錯誤與對策

錯誤訊息原因對策
該資料庫處於回避恢復模式未執行 sp_dboption single user 或未重啟服務設定單一使用者 → DBCC CHECKDB → 重啟
版本號 (539) 新於目前伺服器版本 (515)嘗試將 SQL 2000 備份還原到 SQL 7.0先還原到 SQL 2000,再用 DTS 轉移到 SQL 7.0

核心原則總結

  1. 備份是恢復的前提:無完整備份 = 無法保證零資料遺失。
  2. 記錄檔比資料檔更關鍵:尾端記錄備份 (NO_TRUNCATE) 是災難時刻的救命稻草。
  3. Emergency Mode + 重建 Log 是無備份時的最後嘗試,成功率視損壞程度而定。
  4. DBCC 修復有風險:REPAIR_ALLOW_DATA_LOSS 會刪除損壞頁,務必先備份現狀 .mdf。
  5. 版本相容性:不可將高版本資料庫附加/還原到低版本引擎。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved