閃回查詢能否成功,關鍵在於 Undo 保留時間(UNDO_RETENTION) 是否足夠覆蓋目標時間點。設定方式:
ALTER SYSTEM SET UNDO_RETENTION = <秒數> SCOPE=BOTH;
建議依業務需求設定(如 24 小時 = 86400 秒),並確保 Undo 表空間有足夠空間避免「快照太舊」錯誤(ORA-01555)。
Oracle 提供 DBMS_FLASHBACK 套件,讓單一會話在不影響其他用戶的情況下回溯歷史資料:
ENABLE_AT_TIME(ts):將會話 SCN 定格在指定時間戳最近的 SCN。ENABLE_AT_SYSTEM_CHANGE_NUMBER(scn):直接指定 SCN。GET_SYSTEM_CHANGE_NUMBER:取得當前 SCN。DISABLE():結束閃回,回到當前時間。注意事項:
ENABLE 程序。NLS_DATE_FORMAT 含時分秒(預設僅到天),否則時間精度會遺失。Oracle 內部以 SCN 為時間基準,即使使用 AS OF TIMESTAMP 也會轉換為 SCN。映射資料儲存在 SYS.SMON_SCN_TIME 表:
SCN_TO_TIMESTAMP()、TIMESTAMP_TO_SCN() 函數直接轉換。-- 查看近期映射
SELECT scn, TO_CHAR(time_dp, 'yyyy-mm-dd hh24:mi:ss') FROM sys.smon_scn_time;
-- 時間轉 SCN 範例
SELECT timestamp_to_scn(TO_TIMESTAMP('2010-10-19 21:00:00','YYYY-MM-DD HH24:MI:SS')) FROM dual;
SELECT COUNT(*) FROM t1 AS OF SCN 1482600;INSERT INTO t1 SELECT * FROM t1 AS OF SCN 1482600;FLASHBACK TABLE t1 TO SCN 1482600;DROP TABLE:FLASHBACK TABLE t1 TO BEFORE DROP;(需啟用回收筒)。結合 VERSIONS BETWEEN SCN 或 VERSIONS BETWEEN TIMESTAMP 可追蹤列級變更歷程,搭配 DBMS_FLASHBACK.TRANSACTION_BACKOUT 甚至能針對性回滾特定交易,是資料保護與合規審計的利器。