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

SQL Server 無記錄檔恢復資料庫:兩大實戰方案完整紀錄

     編輯:關於SqlServer

背景

誤刪或損壞交易記錄檔(.ldf),導致資料庫進入「置疑」狀態,無法正常存取。資料珍貴,必須搶救。

方案一:建立同名資料庫覆蓋法(較簡單)

  1. 建立同名空資料庫
  2. 停止 SQL Server 服務
  3. 用原 .mdf 覆蓋新建資料庫的 .mdf
  4. 重新啟動 SQL Server
  5. 資料庫顯示「置疑」,執行修復腳本
  6. 成功後,腳本重建新資料庫並導入資料

修復腳本

USE MASTER;
GO
SP_CONFIGURE 'ALLOW UPDATES', 1;
RECONFIGURE WITH OVERRIDE;
GO
UPDATE SYSDATABASES SET STATUS = 32768 WHERE NAME = '置疑資料庫名';
GO
SP_DBOPTION '置疑資料庫名', 'single user', 'true';
GO
DBCC CHECKDB('置疑資料庫名');
GO
UPDATE SYSDATABASES SET STATUS = 28 WHERE NAME = '置疑資料庫名';
GO
SP_CONFIGURE 'ALLOW UPDATES', 0;
RECONFIGURE WITH OVERRIDE;
GO
SP_DBOPTION '置疑資料庫名', 'single user', 'false';
GO

方案二:緊急模式完整恢復流程(較徹底,作者實測成功)

核心步驟

  1. 將原 .mdf 移走
  2. 建立同名空資料庫
  3. 停止服務,移回原 .mdf
  4. 啟用系統表更新,設資料庫為緊急模式 (status = 32768)
  5. 重啟服務
  6. 設為單用戶模式
  7. 執行 DBCC CHECKDB 修復
  8. 重置狀態,關閉系統表更新
  9. 建立新資料庫,用 DTS/查詢導出資料
  10. 重建索引

關鍵腳本

-- 1. 啟用系統表更新
USE MASTER;
GO
SP_CONFIGURE 'allow updates', 1;
RECONFIGURE WITH OVERRIDE;
GO

-- 2. 設定緊急模式
UPDATE SYSDATABASES SET STATUS = 32768 WHERE NAME = 'XXX';
GO

-- 重啟服務後...
-- 3. 單用戶模式
SP_DBOPTION 'XXX', 'single user', 'true';
GO

-- 4. 檢查修復
DBCC CHECKDB('XXX');
GO

-- 5. 重置狀態
EXEC SP_RESETSTATUS 'XXX';
GO
SP_CONFIGURE 'allow updates', 0;
RECONFIGURE WITH OVERRIDE;
GO

索引維護補充

-- 檢查掃描密度
DECLARE @table_id INT = OBJECT_ID('表名');
DBCC SHOWCONTIG(@table_id);

-- 重建指定索引
DBCC DBREINDEX('表名', 'PK_索引名', 100);

-- 重建所有索引
DBCC DBREINDEX('表名', '', 100);

避坑指南

  • 先備份 .mdf,任何操作前複製一份
  • 方案二步驟順序不可亂,特別是「移走→建空庫→移回→設模式→重啟」
  • DBCC CHECKDB 若報錯,依錯誤訊息處理,或嘗試 REPAIR_ALLOW_DATA_LOSS(最後手段)
  • 恢復後務必 匯出到新資料庫,原資料庫結構可能已受損

無記錄檔恢復屬高風險操作,生產環境請在 DBA 指導下進行,並確保有完整備份策略避免再次發生。

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