-- 僅附加資料檔
EXEC sp_attach_db @dbname = 'MyDB', @filename1 = 'D:\Data\MyDB.mdf';
-- 或停機複製所有檔案 (含 master) 回原路徑 (不建議)
存儲子系統故障常導致記錄檔不可用,且無近期備份。嘗試以下階梯式恢復:
EXEC sp_attach_single_file_db @dbname = 'MyDB', @physname = 'D:\Data\MyDB.mdf';
-- 1. 允許系統表更新
USE master;
EXEC sp_configure 'allow updates', 1; RECONFIGURE WITH OVERRIDE;
-- 2. 設定資料庫為 EMERGENCY 模式 (status = 32768)
UPDATE sysdatabases SET status = 32768 WHERE name = 'MyDB';
-- 3. 重建記錄檔 (系統會自動建立新 log)
-- 無報錯即成功
-- 4. 重啟 SQL Server 服務
-- 5. 單用戶模式 + DBCC 檢查
EXEC sp_dboption 'MyDB', 'single user', 'true';
DBCC CHECKDB('MyDB');
-- 6. 修復錯誤 (視嚴重度)
DBCC CHECKDB('MyDB', REPAIR_REBUILD); -- 輕微
DBCC CHECKDB('MyDB', REPAIR_ALLOW_DATA_LOSS); -- 嚴重,可能遺失資料
-- 7. 逐表深度檢查
DECLARE @tbl sysname;
DECLARE cur CURSOR FOR
SELECT name FROM sysobjects WHERE OBJECTPROPERTY(id, 'IsUserTable') = 1;
OPEN cur;
FETCH NEXT FROM cur INTO @tbl;
WHILE @@FETCH_STATUS = 0
BEGIN
DBCC CHECKTABLE(@tbl);
FETCH NEXT FROM cur INTO @tbl;
END
CLOSE cur; DEALLOCATE cur;
-- 8. 重建索引/視圖/SP/Trigger
DBCC DBREINDEX('MyTable', '', 80);
-- 9. 恢復資料庫狀態
UPDATE sysdatabases SET status = 28 WHERE name = 'MyDB'; -- 或正常狀態值
EXEC sp_resetstatus 'MyDB';
EXEC sp_configure 'allow updates', 0; RECONFIGURE WITH OVERRIDE;
REPAIR_ALLOW_DATA_LOSS 為最後手段,**務必先備份 .mdf 複本**allow updates,改用 ALTER DATABASE ... SET EMERGENCYALTER DATABASE MyDB SET EMERGENCY; ALTER DATABASE MyDB SET SINGLE_USER; DBCC CHECKDB ...suspect_pages、msdb..backupmediafamily、磁碟健康度災難恢復核心:**備份是前提,緊急模式重建記錄檔是絕招,DBCC 修復是收尾**。平時多演練、多驗證備份可用性,關鍵時刻才能從容應對。