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

僅有 MDF 檔案時附加資料庫失敗:手動重建記錄檔完整修復流程

     編輯:關於SqlServer

問題背景

DBA 為縮減記錄檔,執行「卸離 → 刪除 LDF → 附加 MDF」,但附加報錯:

訊息 1813,層級 16:無法開啟新資料庫 'test'。CREATE DATABASE 終止。裝置啟動錯誤。實體檔名 "d:\data\test_log.LDF" 可能有誤。

原因:資料庫卸離時有未提交交易或檢查點未完成,MDF 內部仍標記需要對應 LDF。單純附加無法自動重建記錄檔。

手動修復 10 步驟 (已驗證可行)

  1. 建立同名空資料庫 (Enterprise Manager 或 T-SQL),路徑設為目標資料夾 (如 D:\Data\),產生 test.mdf, test_log.ldf。
  2. 停止 SQL Server 服務 (服務管理員或 net stop mssqlserver)。
  3. 替換 MDF:刪除新建的 test.mdf,將原始損壞的 test.mdf 複製到資料目錄覆蓋。
  4. 啟動 SQL Server 服務。資料庫將顯示 「置疑」**。
  5. 允許系統表直接更新:
    USE master; GO
    EXEC sp_configure 'allow updates', 1; RECONFIGURE WITH OVERRIDE; GO
    
  6. 設定資料庫進入緊急修復模式:
    UPDATE sysdatabases SET status = -32768 WHERE dbid = DB_ID('test'); GO
    

    重新整理 EM,資料庫顯示「唯讀/置疑/離線/緊急模式」,僅見系統表。

  7. 重建記錄檔 (關鍵步驟):
    DBCC REBUILD_LOG('test', 'D:\Data\test_log.ldf'); GO
    

    前提:EM 已關閉、無任何連線佔用資料庫,否則報錯 5030 (無法排他鎖定)。
    成功訊息:警告: 資料庫 'test' 的日誌已重建。已失去交易一致性。應執行 DBCC CHECKDB...

  8. 驗證物理一致性 (建議執行):
    DBCC CHECKDB('test'); GO
    

    應回傳 0 個配置錯誤和 0 個一致性錯誤。

  9. 恢復資料庫為正常模式:
    EXEC sp_dboption 'test', 'dbo use only', 'false'; GO
    
  10. 關閉系統表直接更新** (安全收尾):
    EXEC sp_configure 'allow updates', 0; RECONFIGURE WITH OVERRIDE; GO
    

關鍵風險與事後必做

風險說明緩解措施
交易一致性遺失REBUILD_LOG 捨棄記錄檔中未寫入資料檔的已提交交易,及未提交交易事後立即完整備份;業務驗證關鍵資料完整性;若不可接受,需從備份還原
資料庫選項重置自動關閉、自動縮減、復原模式等可能恢復預設檢查並重設 sp_dboption / ALTER DATABASE 選項
複寫/鏡像/記錄傳送中斷LSN 鏈斷裂重新初始化所有相關拓撲

預防勝於治療

  • 絕不直接刪除 LDF。正確縮減記錄檔:ALTER DATABASE test SET RECOVERY SIMPLE; DBCC SHRINKFILE(test_log, 100); ALTER DATABASE test SET RECOVERY FULL;
  • 建立定期完整備份 + 記錄備份 + 完整性檢查 (DBCC CHECKDB) 排程。
  • 啟用資料庫頁面驗證 CHECKSUM、啟用壓縮備份 (SQL 2008+)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved