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

SQL Server 資料庫檔案級備份與還原:從正常掛載到僅有 MDF 的災難救援

     編輯:關於SqlServer

前言

SQL Server 備份除 BACKUP DATABASE 外,直接複製 .mdf (資料檔) 與 .ldf (記錄檔) 也是常見做法。本文詳述正常掛載流程,並深入解析僅有 MDF 檔案時的緊急還原技術。

一、正常掛載/卸離流程

-- 卸離資料庫
EXEC sp_detach_db 'db_name';

-- 掛載完整資料庫 (需 mdf + ldf)
EXEC sp_attach_db @dbname = 'db_name',
    @filename1 = 'path\db_data.mdf',
    @filename2 = 'path\db_log.ldf';

-- 僅掛載資料檔 (自動建立新記錄檔)
EXEC sp_attach_single_file_db @dbname = 'db_name',
    @physname = 'path\db_data.mdf';

關鍵:備份時務必同時複製 .mdf 與 .ldf 兩個檔案。

二、僅有 MDF 檔案的還原技術

情境:僅備份了 MDF,或從其他伺服器複製來的 MDF 無對應 LDF,直接 sp_attach_single_file_db 可能失敗,報錯:

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

完整救援步驟

  1. 建立同名空資料庫:企業管理員或 CREATE DATABASE test
  2. 停止 SQL Server 服務
  3. 替換檔案:刪除新建資料庫的 test_log.ldf,用備份的 test_data.mdf 覆蓋 test_data.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
    
    企業管理員顯示「唯讀/置疑/離線/緊急模式」,僅見系統表。
  7. 重建記錄檔:
    DBCC REBUILD_LOG('test', 'path\test_log.ldf'); GO
    
    若報錯「無法排他鎖定」,關閉企業管理員連線後重試。成功訊息:「警告: 資料庫 'test' 的日誌已重建。已失去交易一致性...」
  8. 驗證一致性 (可選):DBCC CHECKDB('test')
  9. 設定回正常模式:
    EXEC sp_dboption 'test', 'dbo use only', 'false'; GO
    
  10. 關閉系統目錄修改:
    EXEC sp_configure 'allow updates', 0; RECONFIGURE WITH OVERRIDE; GO
    

關鍵提醒

  • 此流程會導致交易一致性遺失,僅適用於災難救援,平時請務必完整備份 MDF+LDF
  • 步驟 5-6 涉及直接修改系統表,風險極高,操作前請三思
  • 救援完成後,建議腳本產生新資料庫結構,用 DTS/BCP 導入資料,取代修復後的資料庫
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved