當僅擁有資料庫資料檔 (.mdf) 而無日誌檔 (.ldf) 或完整備份 (.bak) 時,可透過「建立空資料庫 → 替換 MDF → 重建日誌」流程將資料掛載回 SQL Server。本文適用於 SQL Server 2000/2005/2008/2012 等版本(指令相容)。
⚠ 風險提示:此屬緊急搶救手段,重建日誌會導致交易一致性遺失,執行前請務必備份原始 MDF 檔案,生產環境建議優先嘗試RESTORE DATABASE或DBCC CHECKDB (REPAIR_ALLOW_DATA_LOSS)。
USE master;
GO
CREATE DATABASE MHDYF2005
ON (NAME = 'MHDYF2005_data', FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL\Data\MHDYF2005_data.mdf')
LOG ON (NAME = 'MHDYF2005_log', FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL\Data\MHDYF2005_log.ldf');
GO
透過「服務」管理工具 (services.msc) 或 SQL Server Configuration Manager 停止對應執行個體服務。
MHDYF2005_log.ldf。yu1.mdf 複製並覆蓋為 MHDYF2005_data.mdf。重新啟動 SQL Server 服務。在 SSMS/企業管理員中重新整理,資料庫 MHDYF2005 狀態顯示為 Suspect (置疑)。此時切勿對該資料庫執行任何操作。
USE master;
GO
sp_configure 'allow updates', 1;
RECONFIGURE WITH OVERRIDE;
GO
或在企業管理員 → 伺服器屬性 → 「安全性」頁籤勾選「允許直接修改系統目錄」。
UPDATE sysdatabases SET status = -32768 WHERE dbid = DB_ID('MHDYF2005');
GO
執行後資料庫進入 Emergency Mode (緊急模式),僅可讀取系統表,使用者表不可見。
DBCC REBUILD_LOG('MHDYF2005', 'C:\Program Files\Microsoft SQL Server\MSSQL\Data\MHDYF2005_log.ldf');
GO
常見錯誤:Msg 5030: 無法排他鎖定資料庫 → 原因通常是 SSMS/企業管理員正開啟該資料庫物件,關閉所有連線視窗後重試。
成功訊息:警告: 資料庫 'MHDYF2005' 的日誌已重建。已失去事務的一致性。應執行 DBCC CHECKDB 以驗證物理一致性...
此時資料庫狀態轉為 DBO Use Only (僅限 DBO 使用),可存取使用者資料表。
DBCC CHECKDB('MHDYF2005');
GO
預期結果:CHECKDB 發現了 0 個配置錯誤和 0 個一致性錯誤。
EXEC sp_dboption 'MHDYF2005', 'dbo use only', 'false';
GO
sp_configure 'allow updates', 0;
RECONFIGURE WITH OVERRIDE;
GO
DBCC CHECKDB WITH DATA_PURITY 深度掃描資料純度。| 問題 | 原因與對策 |
|---|---|
| REBUILD_LOG 失敗:無法排他鎖定 | 有其他連線正在使用該資料庫 → 關閉所有 SSMS/查詢視窗、停止應用服務、或設定 SINGLE_USER 模式後重試。 |
| 重建後資料遺失/不一致 | 重建日誌會丟棄未提交交易 → 僅作為最後手段,優先尋找完整備份/交易日誌備份進行時間點還原。 |
| SQL Server 2012+ 版本 | 指令相容,但建議改用 CREATE DATABASE ... FOR ATTACH_REBUILD_LOG 語法更簡潔。 |
MDF 掛載還原是 DBA 武器庫中的「急救刀」,雖能在無備份時搶救資料,但伴隨交易一致性風險。平時建立完整備份策略(完整+差異+交易日誌)、定期演練還原、啟用頁面驗證與資料庫郵件警示,才是資料安全的根本之道。