資料更新/刪除時,舊版本寫入 UNDO 表空間。UNDO_RETENTION(秒)設定最小保留時間,實際保留視 UNDO 表空間大小與變更頻率而定。Flashback 讀取 UNDO 重構歷史影像。
ALTER SYSTEM SET UNDO_MANAGEMENT = AUTO SCOPE=BOTH;
ALTER SYSTEM SET UNDO_RETENTION = 86400 SCOPE=BOTH; -- 保留 1 天
GRANT EXECUTE ON DBMS_FLASHBACK TO <用戶>;
需保證 UNDO 表空間足夠大(繁忙系統可能需數十 GB)。
| 形式 | 語法 | 適用場景 | 版本 |
|---|---|---|---|
| 閃回查詢 | SELECT * FROM t AS OF TIMESTAMP TO_TIMESTAMP('2024-01-01 10:00','YYYY-MM-DD HH24:MI:SS'); | 開發/測試環境快速回看、單表歷史對比 | 9i+ |
| 閃回版本查詢 | SELECT * FROM t VERSIONS BETWEEN TIMESTAMP ... | 查看某行所有歷史版本變更軌跡 | 10g+ |
| 閃回事務查詢 | SELECT * FROM FLASHBACK_TRANSACTION_QUERY WHERE xid = ... | 審計:某事務具體修改了哪些表、行 | 10g+ |
-- 以 SCN
EXEC DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER(123456);
-- 以時間
EXEC DBMS_FLASHBACK.ENABLE_AT_TIME('2024-01-01 10:00:00');
-- 查詢執行...
EXEC DBMS_FLASHBACK.DISABLE();
⚠️ 閃回會話中**不可執行 DML/DDL**,僅供查詢。需先將結果存入臨時表再應用。
-- 表級閃回(需啟用 ROW MOVEMENT)
ALTER TABLE t ENABLE ROW MOVEMENT;
FLASHBACK TABLE t TO TIMESTAMP TO_TIMESTAMP('2024-01-01 10:00','YYYY-MM-DD HH24:MI:SS');
-- 資料庫級閃回(需歸檔模式、FRA 配置)
FLASHBACK DATABASE TO TIMESTAMP TO_TIMESTAMP('2024-01-01 10:00','YYYY-MM-DD HH24:MI:SS');
-- 需 MOUNT 狀態執行,完成後 OPEN RESETLOGS
DROP TABLE、TRUNCATE 等結構變更)。ORA-01555 snapshot too old → 擴大 UNDO 表空間或增加 UNDO_RETENTION。DB_FLASHBACK_RETENTION_TARGET。UNDO_RETENTION=86400、大 UNDO 表空間,日常用 AS OF TIMESTAMP 快速回滾測試資料。FLASHBACK_TRANSACTION_QUERY 記錄關鍵表變更,存入不可竄改審計庫。