首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 僅有 MDF 檔案時的資料庫還原實戰:重建記錄檔 (LDF) 完整步驟

     編輯:關於SqlServer

情境:僅有 MDF,LDF 遺失/損毀,SSMS 附加報錯

錯誤訊息通常為:「裝置啟動錯誤」或「無法開啟資料庫」。核心原因:資料庫引擎啟動時**必須有交易記錄檔**,缺失時無法完成復原程序。

標準修復流程 (適用 SQL 2005/2008/2012/2014/2016/2017/2019)

步驟 1:清理殘留資料庫(若存在)


-- 若 SSMS 顯示「Recovery Pending」或類似狀態,先刪除
DROP DATABASE [wtlog_2008_m12];
GO

步驟 2:備份原始 MDF(關鍵)


-- 在檔案系統將原 MDF 更名備份
-- wtlog_2008_m12.mdf → wtlog_2008_m12_bak.mdf

步驟 3:建立同名空資料庫(產生新 LDF)


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 內部記錄的邏輯名衝突。

步驟 4:離線替換 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** 狀態。

步驟 5:緊急模式重建記錄檔 (核心)


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:在指定路徑建立**全新空白記錄檔**,原交易鏈中斷。

步驟 6:清理多餘檔案

確認資料庫正常上線後,刪除步驟 4 產生的備份檔 wtlog_2008_m12___.mdf。

驗證與後續建議

  1. DBCC CHECKDB('wtlog_2008_m12') — 檢查物理/邏輯一致性。
  2. 核心業務表資料筆數、關鍵欄位抽樣比對。
  3. **立即進行完整備份**:BACKUP DATABASE ... TO DISK = ...,建立可信任的復原基準點。
  4. 若發現資料損壞且無備份,請尋求專業資料救援服務。

避坑指南

錯誤做法後果正確做法
直接附加單一 MDF報錯「裝置啟動錯誤」必須先建立空資料庫產生 LDF,再替換 MDF 重建記錄檔
使用 sp_attach_single_file_db僅適用正常脫離的 MDF,異常/跨機器多半失效改用 ALTER DATABASE REBUILD LOG
未停止服務直接覆蓋 MDF檔案鎖定無法覆蓋,或引擎緩存不一致導致損壞務必停止服務再替換檔案
重建記錄檔後不備份後續故障無可信任復原點重建成功即刻完整備份

結語

「只有 MDF 沒有 LDF」是典型災難復原情境。掌握 **建立空資料庫 → 替換 MDF → EMERGENCY + REBUILD LOG** 標準流程,配合 DBCC CHECKDB 驗證與即時備份,即可最大程度挽回資料。記住:**重建記錄檔犧牲交易一致性,僅作最後手段,平時備份才是王道**。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved