誤執行 UPDATE 或 DELETE 未帶 WHERE 子句、或條件不精確導致大量資料異動,是 DBA 最怕的噩夢。若資料庫處於 完整復原模式 且有完整備份鏈,**交易記錄備份 + 時間點還原** 是唯一能將資料「精準倒回誤操作前一秒」的方法。
| 條件 | 驗證方式 | 不符合後果 |
|---|---|---|
| 資料庫為完整復原模式 | SELECT recovery_model_desc FROM sys.databases WHERE name='DBName' | 無法備份記錄、無法時間點還原 |
| 有最近的完整備份 | SELECT * FROM msdb..backupset WHERE database_name='DBName' AND type='D' ORDER BY backup_finish_date DESC | 只能還原到最後一次完整備份時間點 |
| 誤操作後未執行 TRUNCATE TABLE / DROP TABLE | 檢查應用程式邏輯 | 非記錄操作無法透過記錄還原 |
| 記錄未被截斷 | 確認未設定 TRUNC. LOG ON CHKPT 或簡單模式 | 記錄已失效,無法還原 |
BACKUP LOG DBName TO DISK = 'D:\Backup\DBName_TailLog.trn'
WITH NOFORMAT, NOINIT, NAME = 'TailLog_Before_Restore', NOSKIP, STATS = 10;
關鍵:捕捉誤操作到目前為止的所有交易記錄,確保還原點可精確到誤操作前。
NORECOVERY)RESTORE DATABASE DBName
FROM DISK = 'D:\Backup\DBName_Full.bak'
WITH NORECOVERY,
MOVE 'DBName_Data' TO 'D:\Data\DBName.mdf',
MOVE 'DBName_Log' TO 'D:\Log\DBName.ldf',
STATS = 10;
若有差異備份,依序還原最新差異備份(同樣 NORECOVERY)。
RESTORE LOG DBName
FROM DISK = 'D:\Backup\DBName_TailLog.trn'
WITH STOPAT = '2024-01-15 14:30:00.000', -- 誤操作發生前幾秒
RECOVERY,
STATS = 10;
STOPAT 精確到毫秒。若不確定確切時間,可先 STOPAT = '... 14:29:59' 還原至 STANDBY 模式檢查資料,再決定最終還原點。
| 情況 | 症狀 | 解決方案 |
|---|---|---|
| 誤操作是 TRUNCATE TABLE | 記錄中僅有分頁配置資訊,無資料列刪除記錄 | 無法透過記錄還原,必須從完整備份還原整庫 |
| 誤操作是 DROP TABLE | 結構與資料同步消失 | 同 TRUNCATE,需完整備份還原 |
| 資料庫為簡單復原模式 | 無法備份記錄,BACKUP LOG 報錯 | 只能還原到最後一次完整/差異備份點,資料遺失量 = 最後備份至誤操作間的所有變更 |
| 尾記錄備份失敗(記錄檔損壞) | BACKUP LOG 報 I/O 錯誤 | 嘗試 BACKUP LOG ... WITH NO_TRUNCATE(僅 SQL 2005+);否則只能從現有記錄備份還原,誤操作後的變更永久遺失 |
| 還原過程中發現頁面損壞 | RESTORE 報 823/824/825 錯誤 | 需從頁面層級備份還原,或執行 DBCC CHECKDB (REPAIR_ALLOW_DATA_LOSS) 後再試 |
ALTER DATABASE DBName SET RECOVERY FULL;EXECUTE 預存程序權限,禁止直接 UPDATE/DELETE 資料表;交易記錄時間點還原是 SQL Server 完整復原模式下最強大的「後悔藥」。但它的前提是:**完整備份鏈完整、記錄未截斷、尾記錄備份成功**。平日備份策略若未落實,災難發生時將追悔莫及。請立即檢查您的生產環境:復原模式、備份頻率、尾記錄備份腳本是否就緒?