錯誤訊息通常為:「裝置啟動錯誤」或「無法開啟資料庫」。核心原因:資料庫引擎啟動時**必須有交易記錄檔**,缺失時無法完成復原程序。
-- 若 SSMS 顯示「Recovery Pending」或類似狀態,先刪除
DROP DATABASE [wtlog_2008_m12];
GO
-- 在檔案系統將原 MDF 更名備份
-- wtlog_2008_m12.mdf → wtlog_2008_m12_bak.mdf
CREATE DATABASE [wtlog_2008_m12]
ON (NAME = N'wtlog_2008_m12', FILENAME = N'D:\Data\wtlog_2008_m12.mdf')
LOG ON (NAME = N'wtlog_2008_m12_log', FILENAME = N'D:\Log\wtlog_2008_m12_log.ldf');
GO
⚠️ **邏輯檔名不可重複**:新資料庫的 LDF 邏輯名建議加 _log 後綴,避免與原 MDF 內部記錄的邏輯名衝突。
-- 1. 停止 SQL Server 服務 (MSSQLSERVER)
-- 2. 檔案系統操作:
-- 新建的 wtlog_2008_m12.mdf → 更名 wtlog_2008_m12___.mdf (備份)
-- 原始 wtlog_2008_m12_bak.mdf → 改回 wtlog_2008_m12.mdf (覆蓋)
-- 3. 啟動 SQL Server 服務
此時資料庫將進入 **RECOVERY_PENDING / SUSPECT** 狀態。
ALTER DATABASE [wtlog_2008_m12] SET EMERGENCY;
GO
ALTER DATABASE [wtlog_2008_m12] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
ALTER DATABASE [wtlog_2008_m12] REBUILD LOG ON (NAME = N'wtlog_2008_m12', FILENAME = N'D:\Log\wtlog_2008_m12.ldf');
GO
ALTER DATABASE [wtlog_2008_m12] SET MULTI_USER;
GO
EMERGENCY:僅允許 sysadmin 存取,繞過復原。SINGLE_USER WITH ROLLBACK IMMEDIATE:強制獨佔,終止現有連線。REBUILD LOG:在指定路徑建立**全新空白記錄檔**,原交易鏈中斷。確認資料庫正常上線後,刪除步驟 4 產生的備份檔 wtlog_2008_m12___.mdf。
DBCC CHECKDB('wtlog_2008_m12') — 檢查物理/邏輯一致性。BACKUP DATABASE ... TO DISK = ...,建立可信任的復原基準點。| 錯誤做法 | 後果 | 正確做法 |
|---|---|---|
| 直接附加單一 MDF | 報錯「裝置啟動錯誤」 | 必須先建立空資料庫產生 LDF,再替換 MDF 重建記錄檔 |
使用 sp_attach_single_file_db | 僅適用正常脫離的 MDF,異常/跨機器多半失效 | 改用 ALTER DATABASE REBUILD LOG |
| 未停止服務直接覆蓋 MDF | 檔案鎖定無法覆蓋,或引擎緩存不一致導致損壞 | 務必停止服務再替換檔案 |
| 重建記錄檔後不備份 | 後續故障無可信任復原點 | 重建成功即刻完整備份 |
「只有 MDF 沒有 LDF」是典型災難復原情境。掌握 **建立空資料庫 → 替換 MDF → EMERGENCY + REBUILD LOG** 標準流程,配合 DBCC CHECKDB 驗證與即時備份,即可最大程度挽回資料。記住:**重建記錄檔犧牲交易一致性,僅作最後手段,平時備份才是王道**。