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

SQL Server 僅有 .mdf 檔案時的資料庫緊急恢復流程 (附單一檔案掛載腳本)

     編輯:關於SqlServer

適用情境

  • .ldf (記錄檔) 遺失、損毀、被誤刪。
  • 僅備份了 .mdf (或從檔案系統層級複製了 .mdf)。
  • **資料可能損失** (未提交交易、記錄檔中尚未寫入資料頁的變更),但能搶救大部分已提交資料。

恢復步驟 (SQL Server 2005/2008/2012+ 通用)

步驟 1:建立同名空資料庫並取代 .mdf

-- 1. 建立同名資料庫 (路徑自訂)
CREATE DATABASE RecoverDB 
ON (NAME = RecoverDB, FILENAME = 'D:\Data\RecoverDB.mdf')
LOG ON (NAME = RecoverDB_log, FILENAME = 'D:\Data\RecoverDB_log.ldf');
GO

-- 2. 停止 SQL Server 服務 (服務管理器 / net stop MSSQLSERVER)

-- 3. 用備份的 .mdf 覆蓋剛建立的 .mdf
--    copy /y "BackupPath\RecoverDB.mdf" "D:\Data\RecoverDB.mdf"

-- 4. 啟動 SQL Server 服務
--    資料庫將進入「疑似損毀」或「緊急模式」狀態

步驟 2:進入緊急模式並修復 (核心腳本)


-- 切換至 master
USE master;
GO

-- 宣告變數
DECLARE @dbname sysname = 'RecoverDB'; -- 你的資料庫名稱

-- 1. 設為緊急模式 (僅 sysadmin 可存取, 唯讀, 不執行復原)
ALTER DATABASE @dbname SET EMERGENCY;
GO

-- 2. 設為單用戶模式 (防止其他連線干擾修復)
EXEC sp_dboption @dbname, 'single user', 'true'; -- 舊版相容
-- 或新版: ALTER DATABASE @dbname SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO

-- 3. 執行修復 (允許資料遺失 - 最後手段)
--    REPAIR_ALLOW_DATA_LOSS: 刪除損毀頁面/索引, 盡力救資料
DBCC CHECKDB (@dbname, REPAIR_ALLOW_DATA_LOSS) WITH NO_INFOMSGS, ALL_ERRORMSGS;
GO

-- 4. 重建索引/修復邏輯錯誤 (非資料遺失層級)
DBCC CHECKDB (@dbname, REPAIR_REBUILD) WITH NO_INFOMSGS, ALL_ERRORMSGS;
GO

-- 5. 恢復多用戶模式
EXEC sp_dboption @dbname, 'single user', 'false';
-- 或: ALTER DATABASE @dbname SET MULTI_USER;
GO

-- 6. 退出緊急模式 (自動執行復原, 使資料庫一致)
ALTER DATABASE @dbname SET ONLINE;
GO

步驟 3:驗證與匯出

  1. 檢查資料庫狀態:SELECT name, state_desc FROM sys.databases WHERE name = 'RecoverDB'; 應為 ONLINE。
  2. 核對關鍵資料表筆數、業務關鍵欄位。
  3. **立即匯出** 至新建立的健全資料庫:
    SELECT * INTO NewHealthyDB.dbo.Table FROM RecoverDB.dbo.Table; 或用匯入匯出精靈/BCP/SSIS。
  4. 驗證無誤後,將新資料庫投入生產,舊資料庫下線備份封存。

關鍵指令解析

指令/選項作用風險
SET EMERGENCY繞過正常啟動復原,直接掛載資料庫 (唯讀、sysadmin 限定)低
SINGLE_USER獨佔存取,防止修復過程被干擾中 (踢掉現有連線)
REPAIR_ALLOW_DATA_LOSS刪除無法修復的頁面/索引,**永久遺失該頁資料****極高** (不可逆)
REPAIR_REBUILD重建索引、修復非資料頁錯誤,**不遺失資料**低

常見錯誤與對策

  • 「資料庫其他檔案與主檔案不匹配」:執行完 REPAIR_ALLOW_DATA_LOSS 後再跑一次 REPAIR_REBUILD,或重複執行修復腳本 2-3 次直到無錯誤。
  • 修復後資料庫仍標示緊急模式:執行 ALTER DATABASE ... SET ONLINE 觸發最終復原。
  • 系統表 (sysobjects 等) 損毀:極難修復,嘗試用 DBCC CHECKDB ... REPAIR_ALLOW_DATA_LOSS 多跑幾次,或尋求 Microsoft 支援/第三方資料救援工具 (如 Stellar Repair for MS SQL)。

預防勝於治療

  1. 定期完整備份 + 記錄檔備份 (FULL + LOG),而非僅複製 .mdf。
  2. 啟用 CHECKSUM 頁面驗證:ALTER DATABASE ... SET PAGE_VERIFY CHECKSUM;。
  3. 排程 DBCC CHECKDB 例行檢查 (每週/每日),早期發現損毀。
  4. 記錄檔放在**不同實體磁碟/陣列** 與資料檔,單點故障不同時毀雙檔。

總結

僅有 .mdf 時,**緊急模式 + 單用戶 + REPAIR_ALLOW_DATA_LOSS** 是最後搶救手段。**必須接受資料遺失風險**,修復後務必全量匯出至新庫。平日備份策略到位,根本不需走上這條不歸路。

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