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

SQL Server 2005 误删除数据恢复实战:利用事务日志与 Log Explorer 找回 2 万笔资料

     編輯:關於SqlServer

事故現場

  • 同事執行錯誤腳本,刪除重要表 ~20,000 筆資料。
  • 事發後進行完整備份,**覆蓋**了前一日備份,且**無記錄備份**。
  • 幸運的是:**事發後未截斷記錄檔**,LDF 仍保留刪除操作的記錄。

恢復原理:時間點還原

若有完整備份 + 記錄備份鏈,可還原至任意時間點。本案例無記錄備份,但記錄檔未截斷,可使用第三方工具 **ApexSQL Log / SQL Log Rescue / Log Explorer** 直接解析 LDF,產生反向操作腳本 (INSERT 回刪除的資料)。

工具選擇:Log Explorer (支援 SQL 2005)

  • 官方版本早期不支援 SQL 2005,需尋找更新版 (CSDN 下載: source/467751)。
  • 掃描 LDF → 篩選 DELETE 操作 → 產生 INSERT 腳本 → 執行恢復。

標準時間點還原演示腳本 (有完整備份+記錄備份時)

-- 1. 建立測試環境
CREATE DATABASE Db; GO
BACKUP DATABASE Db TO DISK='c:\db.bak' WITH FORMAT; GO
CREATE TABLE Db.dbo.TB_test (ID INT); GO
WAITFOR DELAY '00:00:01'; GO  -- 確保時間戳差異

-- 2. 模擬誤刪除
DROP TABLE Db.dbo.TB_test;
SELECT GETDATE() AS DeleteTime INTO #DelTime; GO  -- 記錄刪除時間

-- 3. 備份記錄 (關鍵步驟)
BACKUP LOG Db TO DISK='c:\db_log.bak' WITH FORMAT; GO

-- 4. 還原完整備份 (NORECOVERY 保留狀態)
RESTORE DATABASE Db FROM DISK='c:\db.bak' WITH REPLACE, NORECOVERY; GO

-- 5. 還原記錄至刪除前時間點 (STOPAT)
DECLARE @StopAt DATETIME = DATEADD(MILLISECOND, -20, (SELECT DeleteTime FROM #DelTime));
RESTORE LOG Db FROM DISK='c:\db_log.bak' WITH RECOVERY, STOPAT = @StopAt; GO

-- 6. 驗證
SELECT * FROM Db.dbo.TB_test; -- 應恢復資料

-- 7. 清理
DROP DATABASE Db; DROP TABLE #DelTime;

關鍵成功因素

  1. 記錄檔未被截斷:簡單復原模式下 Checkpoint 會截斷,完整/大量記錄模式需記錄備份才截斷。
  2. 時間精度:STOPAT 精度至毫秒,建議記錄刪除時間並略微提前 (如 -20ms)。
  3. WAITFOR DELAY 確保備份與操作有時間差距,避免同毫秒無法區分。

預防與備援策略

  • 生產庫**強制完整復原模式** + 定期記錄備份 (每 15-30 分鐘)。
  • 重要操作前**手動備份記錄** (或建立資料庫快照 SQL 2005+)。
  • 部署 **ApexSQL Log** 等工具至管理伺服器,定期演練日誌解析恢復。
  • 實施 **DDL/DML 觸發器審計** 關鍵表操作,記錄至審計表。
  • 權限最小化:僅 DBA 擁有 DELETE/TRUNCATE/DROP 權限,開發人員透過預存程序操作。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved