SQL Server 服務停止狀態下,.ldf 交易記錄檔被誤刪(運行中無法刪除)。重新啟動服務後,對應資料庫標記為 SUSPECT(置疑) 狀態,無法存取。
.mdf) 完好無損;-- 1. 分離置疑資料庫(需先設定緊急模式才能分離)
EXEC sp_dboption 'DBName', 'single user', 'true'; -- 防止其他連線干擾
EXEC sp_detach_db 'DBName', 'true'; -- 'true' = skip checks for suspect DB
-- 2. 單一檔案附加(自動重建新 LDF)
EXEC sp_attach_single_file_db @dbname = 'DBName',
@physname = 'D:\Data\DBName.mdf';
原理:sp_attach_single_file_db 僅指定 .mdf,SQL Server 會在相同目錄自動建立新的 .ldf(預設 1MB,自動增長),並標記資料庫為 RECOVERY 完成狀態。
.mdf 檔案 → 確定(自動建立新 LDF)。-- 僅在上述方法失效時嘗試,需追蹤旗標 3608
-- 1. 啟動參數加入 -T3608,重啟 SQL 服務
-- 2. 進入緊急模式
UPDATE master..sysdatabases SET status = 32768 WHERE name = 'DBName'; -- 32768 = EMERGENCY MODE
-- 3. 重建記錄
DBCC REBUILD_LOG('DBName', 'D:\Log\DBName_new.ldf');
-- 4. 移除緊急模式,重啟服務移除 -T3608
警告:DBCC REBUILD_LOG 為未文件化指令,可能導致資料不一致,**僅作為最後手段**,且必須事後執行 DBCC CHECKDB 驗證完整性。
-- 1. 檢查資料庫狀態
SELECT DATABASEPROPERTYEX('DBName', 'Status'); -- 應為 ONLINE
-- 2. 完整性檢查
DBCC CHECKDB('DBName') WITH NO_INFOMSGS, ALL_ERRORMSGS;
-- 3. 業務關鍵資料抽查
SELECT COUNT(*) FROM CriticalTable;
SELECT TOP 10 * FROM CriticalTable ORDER BY ModifiedDate DESC;
| 失敗徵兆 | 可能原因 | 替代方案 |
|---|---|---|
sp_detach_db 報錯「資料庫正在使用中」 | 有殘留連線或系統程序持有鎖定 | ALTER DATABASE DBName SET SINGLE_USER WITH ROLLBACK IMMEDIATE 強制斷開 |
sp_attach_single_file_db 報錯「記錄檔不匹配」 | 資料檔本身損壞,或曾手動縮減記錄檔導致 LSN 斷裂 | 從備份還原;或嘗試 DBCC CHECKDB (REPAIR_ALLOW_DATA_LOSS) |
附加成功但 DBCC CHECKDB 報大量一致性錯誤 | 記錄檔中有作用中交易,重建 LDF 導致交易未回滾/未提交 | 資料已邏輯損壞,必須從備份還原 |
| 資料庫為複寫發布者/訂閱者 | 複寫中繼資料遺失,無法同步 | 重新設定複寫拓撲,或從備份還原整個複寫環境 |
Modify 權限,移除 Everyone/Users 寫入權限;RESTORE VERIFYONLY 驗證備份可用性;遺失 LDF 並非世界末日,**若無作用中交易,分離+單一檔案附加可 99% 成功復原**。關鍵在於:平日確保資料庫正常關閉(無長時間交易)、備份可用、權限最小化。遇到置疑資料庫,**先嘗試標準流程,切勿輕易動用 DBCC REBUILD_LOG 等高風險指令**。