首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle Flashback 技術詳解:9i/10g/11g 閃回查詢、表、資料庫完整對比

     編輯:Oracle 資料庫相關知識

核心原理

資料更新/刪除時,舊版本寫入 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)。

Flashback 查詢三大形式

形式語法適用場景版本
閃回查詢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+

啟用/停用會話級閃回(9i 風格,仍支援)

-- 以 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**,僅供查詢。需先將結果存入臨時表再應用。

進階:Flashback Table / Database(10g+)

-- 表級閃回(需啟用 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

限制與注意

  • 無法閃回 DDL(DROP TABLE、TRUNCATE 等結構變更)。
  • UNDO 空間不足導致 ORA-01555 snapshot too old → 擴大 UNDO 表空間或增加 UNDO_RETENTION。
  • Flashback Database 需預先配置 Fast Recovery Area(FRA)並啟用 DB_FLASHBACK_RETENTION_TARGET。
  • 分區表閃回需逐分區或整表,索引自動維護。

最佳實務

  1. 開發/測試庫:設定 UNDO_RETENTION=86400、大 UNDO 表空間,日常用 AS OF TIMESTAMP 快速回滾測試資料。
  2. 生產庫:啟用 Flashback Database(FRA 獨立磁碟),配合 RMAN 做「秒級」邏輯錯誤恢復,RTO 分鐘級。
  3. 審計合規:排程抽取 FLASHBACK_TRANSACTION_QUERY 記錄關鍵表變更,存入不可竄改審計庫。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved