僅限使用者資料庫 (非 master、msdb、model、tempdb)。系統資料庫損壞請參考官方災難恢復文件。
test (完整復原模式)、建表、插資料。test_1.bak。SHUTDOWN 服務 → 用十六進位編輯器破壞 test_data.mdf 模擬損壞。BACKUP LOG test TO DISK='...test_2.bak' WITH NO_TRUNCATE;RESTORE DATABASE test FROM DISK='...test_1.bak' WITH NORECOVERY;RESTORE LOG test FROM DISK='...test_2.bak' WITH RECOVERY;關鍵:完整備份 + 尾端記錄備份 = 零資料遺失恢復 (RPO=0)。前提是記錄檔未損壞且可存取。
USE master;
GO
sp_configure 'allow updates', 1;
RECONFIGURE WITH OVERRIDE;
GO
UPDATE sysdatabases SET status = 32768 WHERE name = 'YourDB'; -- 32768 = Emergency Mode
GO
SSMS → 資料庫右鍵 → 所有工作 → 附加資料庫 → 僅選 .mdf → 確定 → 系統提示「找不到記錄檔,是否建立新的?」→ 是。
或 T-SQL:sp_attach_single_file_db 'YourDB', 'C:\Path\YourDB_data.mdf';
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 服務
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); -- 最後手段,會遺失資料
SELECT name FROM sysobjects WHERE xtype = 'U' AND OBJECTPROPERTY(id, 'IsUserTable') = 1;
-- 對每個表執行
DBCC CHECKTABLE('TableName', REPAIR_ALLOW_DATA_LOSS);
-- 若仍報錯,嘗試 SELECT * INTO NewTable FROM BadTable 再檢查
DBCC DBREINDEX('TableName'); -- 或 ALTER INDEX ALL ON TableName REBUILD;
-- 重新編譯 SP: sp_recompile 'ProcName';
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 |
REPAIR_ALLOW_DATA_LOSS 會刪除損壞頁,務必先備份現狀 .mdf。