Oracle 閃回技術利用 UNDO 資料實現「時光機」功能,無需傳統恢復即可查看歷史資料、審計變更、修復誤操作。本文深度解析三大核心支柱:閃回查詢 (時間點/SCN)、閃回版本查詢 (行版本歷程)、閃回事務查詢 (事務級 UNDO SQL),附完整實驗腳本與最佳實踐。

DROP ... PURGE 除外)AS OF TIMESTAMP/SCN,查看過去時間點資料VERSIONS BETWEEN,查看行版本變遷FLASHBACK_TRANSACTION_QUERY,查看事務 UNDO SQL核心優勢:恢復時間 = 錯誤發生時間,較傳統介質恢復具備易用性、可用性、RTO 極致優勢。
-- 建立測試表
CREATE TABLE fb_query AS SELECT * FROM scott.dept;
-- 記錄時間點
SELECT SYSDATE FROM dual; -- 2014-03-14 09:51:36
-- 刪除資料
DELETE fb_query WHERE deptno=10; COMMIT;
-- 閃回查詢 (1 分鐘前)
SELECT * FROM fb_query AS OF TIMESTAMP SYSDATE - 1/1440;
-- 完整顯示 4 筆資料,包含 deptno=10
-- 指定精確時間戳
SELECT * FROM fb_query AS OF TIMESTAMP TO_TIMESTAMP('2014-03-14 09:51:36','YYYY-MM-DD HH24:MI:SS');
-- 取得當前 SCN
SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM dual; -- 1107246
-- 刪除資料後
SELECT * FROM fb_query AS OF SCN 1107246; -- 看到刪除前狀態
EXEC DBMS_FLASHBACK.ENABLE_AT_TIME(SYSDATE - 5/1440); -- 5 分鐘前
SELECT * FROM fb_query1; -- 看到 5 分鐘前狀態
SELECT * FROM fb_query2; -- 同 Session 所有查詢生效
EXEC DBMS_FLASHBACK.DISABLE; -- 必須關閉才能執行 DML/DDL
限制:SYS 用戶不可用;閃回模式下禁止 DML/DDL;SYSDATE 仍返回當前時間。
利用偽欄位查看行在時間區間內的所有提交版本:
| 偽欄位 | 含義 |
|---|---|
VERSIONS_STARTSCN / STARTTIME | 版本生效 SCN/時間 (NULL 表示區間前建立) |
VERSIONS_ENDSCN / ENDTIME | 版本失效 SCN/時間 (NULL 表示區間內未變更/未刪除) |
VERSIONS_XID | 事務 ID |
VERSIONS_OPERATION | 操作類型:I (Insert)、U (Update)、D (Delete) |
CREATE TABLE tyger AS SELECT ename, job, sal FROM scott.emp WHERE ROWNUM < 5;
-- 三次更新 SMITH 薪資,每次 COMMIT
UPDATE tyger SET sal=sal+100 WHERE ename='SMITH'; COMMIT;
UPDATE tyger SET sal=sal+100 WHERE ename='SMITH'; COMMIT;
UPDATE tyger SET sal=sal+100 WHERE ename='SMITH'; COMMIT;
-- 版本查詢
SELECT TO_CHAR(VERSIONS_STARTTIME,'YYYY-MM-DD HH24:MI:SS') AS starttime,
VERSIONS_XID, ename, job, sal
FROM tyger
VERSIONS BETWEEN TIMESTAMP TO_DATE('2014-03-14 14:41:46','YYYY-MM-DD HH24:MI:SS') AND MAXVALUE
WHERE ename='SMITH';
-- 結果顯示 4 個版本 (含初始):
-- 14:42:32 080016000F020000 SMITH CLERK 1157
-- 14:42:26 01002C00F1010000 SMITH CLERK 1057
-- 14:42:17 0600180025020000 SMITH CLERK 957
-- (初始) SMITH CLERK 857
查詢 FLASHBACK_TRANSACTION_QUERY 視圖,獲得事務的反向 SQL:
-- 需權限
GRANT SELECT ANY TRANSACTION TO tyger;
-- 查詢特定事務 UNDO SQL
SELECT UNDO_SQL FROM FLASHBACK_TRANSACTION_QUERY WHERE XID = '080016000F020000';
-- 結果:
-- UPDATE "TYGER"."TYGER" SET "SAL" = '1057' WHERE ROWID = 'AAANQ3AAGAAAAYMAAA';
應用場景:
注意:DDL 事務顯示資料字典變更;已刪除表顯示物件編號;已刪除用戶顯示 User ID。
RMAN> VALIDATE CHECK LOGICAL DATABASE; -- 物理+邏輯損壞
RMAN> VALIDATE CHECK LOGICAL TABLESPACE USERS;
RMAN> VALIDATE CHECK LOGICAL DATAFILE 4;
RMAN> VALIDATE ARCHIVELOG ALL;
RMAN> BACKUP VALIDATE DATABASE ARCHIVELOG ALL;
RMAN> RESTORE VALIDATE DATABASE;
主動發現區塊損壞 (物理/邏輯),寫入 ADR 觸發 DRA 流程。
UNDO_RETENTION 確保閃回窗口覆蓋業務需求 (建議 ≥ 24 小時)FLASHBACK ANY TABLE、SELECT ANY TRANSACTION 給審計角色V$UNDOSTAT 監控 UNDO 空間壓力,避免 ORA-01555 導致閃回失敗閃回技術將資料庫從「事後恢復」推進到「即時審計與修復」,是現代 Oracle 高可用架構不可或缺的能力層。