誤刪除並提交後,Oracle Flashback 技術可通過 SCN(系統變更號)或時間戳將表數據恢復到歷史時間點。本文詳述兩種模式的操作步驟、前置條件(ENABLE ROW MOVEMENT)、常見報錯處理,並提供 INSERT ... AS OF 替代方案。
ALTER TABLE 目標表 ENABLE ROW MOVEMENT;
若未啟用,執行 FLASHBACK TABLE 會報 ORA-08189。行移動允許 Oracle 在閃回時調整 Rowid。
SELECT CURRENT_SCN FROM V$DATABASE; -- 需 SYS/SYSTEM 權限
-- 假設返回 1499223
SELECT * FROM 目標表 AS OF SCN 1499220;
-- 確認誤刪數據存在,否則繼續減小 SCN
FLASHBACK TABLE 目標表 TO SCN 1499220;
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM DUAL;
SELECT * FROM 目標表
AS OF TIMESTAMP TO_TIMESTAMP('2013-05-29 15:29:00', 'YYYY-MM-DD HH24:MI:SS');
-- 不存在則調整時間繼續嘗試
FLASHBACK TABLE 目標表
TO TIMESTAMP TO_TIMESTAMP('2013-05-29 15:29:00', 'YYYY-MM-DD HH24:MI:SS');
INSERT INTO 目標表
SELECT * FROM 目標表
AS OF TIMESTAMP TO_DATE('2011-01-19 15:28:00', 'YYYY-MM-DD HH24:MI:SS');
優點:不改變表結構、不需 ENABLE ROW MOVEMENT、可選擇性恢復部分行。
| 限制項 | 說明 |
|---|---|
| UNDO 保留時間 | UNDO_RETENTION 參數與 UNDO 表空間大小決定可閃回多遠,超出則報 ORA-01555 |
| DDL 操作 | 表結構變更(ALTER TABLE)後無法閃回到 DDL 之前 |
| 權限 | 需 FLASHBACK ANY TABLE 或表擁有者權限 |
| 外鍵/觸發器 | 閃回不會自動處理關聯完整性,需手工檢查 |
| 非數據操作 | 無法恢復 TRUNCATE、DROP TABLE(需 Flashback Drop/Database) |
UNDO_RETENTION(建議 ≥ 24 小時)並保障 UNDO 表空間充足(啟用 RETENTION GUARANTEE)。ALTER TABLE ... ENABLE ROW MOVEMENT。INSERT ... AS OF 分批恢復。Flashback Table 是邏輯誤操作的「後悔藥」,雙模式(SCN/時間戳)靈活互補。關鍵在於 UNDO 保留策略與行移動預配置,平時多演練,關鍵時刻才能從容挽回損失。