Flashback 技術利用 UNDO 表空間 保存的歷史資料映像,實現「不還原備份、不停機」的秒級資料回溯與修復,是開發測試環境與生產環境誤操作搶救的利器。
9i Flashback Query 基礎
運作原理
UPDATE/DELETE 時,舊映像寫入 UNDO 表空間。
- 最少保留時間由
UNDO_RETENTION (秒) 控制,實際保留受 UNDO 表空間大小與交易量影響。
- 建議設定
UNDO_RETENTION = 86400 (一天),並確保 UNDO 表空間足夠大。
前置需求
- 啟用自動 UNDO 管理:
ALTER SYSTEM SET UNDO_MANAGEMENT=AUTO
- 設定保留時間:
ALTER SYSTEM SET UNDO_RETENTION=86400
- 授權使用者:
GRANT EXECUTE ON DBMS_FLASHBACK TO username
取得 SCN 或時間點
-- 方法一:DBMS_FLASHBACK 套件
SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER SCN FROM DUAL;
-- 方法二:X$ 表 (需 SYS 權限)
SELECT MAX(KTUXESCNW * POWER(2,32) + KTUXESCNB) SCN FROM X$KTUXE;
-- 取得當前時間格式
ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';
SELECT SYSDATE FROM V$DATABASE;
兩種查詢模式
| 模式 | 語法範例 | 特點 |
| AS OF 子句 (推薦) | SELECT * FROM emp AS OF TIMESTAMP TO_TIMESTAMP('2024-01-01 12:00:00','YYYY-MM-DD HH24:MI:SS'); | 單一查詢、自動恢復現狀、可直接 CREATE TABLE ... AS SELECT 存入暫存表 |
| DBMS_FLASHBACK.ENABLE | EXEC DBMS_FLASHBACK.ENABLE_AT_TIME('01-JAN-2024 12:00:00'); ... 查詢 ... EXEC DBMS_FLASHBACK.DISABLE; | Session 級別啟用、查詢結果為閃回影像、啟用期間不可 DML、需手動 DISABLE |
範例:將誤更新的薪資欄位修復
DECLARE
CURSOR c1 IS SELECT * FROM scott.emp_temp;
r_c1 scott.emp_temp%ROWTYPE;
BEGIN
LOOP
DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER(49570);
IF NOT c1%ISOPEN THEN OPEN c1; END IF;
FETCH c1 INTO r_c1;
DBMS_FLASHBACK.DISABLE;
EXIT WHEN c1%NOTFOUND;
UPDATE scott.emp_temp SET sal = r_c1.sal WHERE empno = r_c1.empno;
COMMIT;
END LOOP;
CLOSE c1;
END;
/
10g Flashback 增強功能
| 功能 | 指令/特性 | 適用場景 |
| Flashback Database | FLASHBACK DATABASE TO TIMESTAMP ... / TO SCN ... | 整個資料庫時間旅行,免傳統 PITR,需啟用 Flashback Logs |
| Flashback Table | FLASHBACK TABLE emp TO TIMESTAMP ... | 單表級回溯,保留索引/約束/觸發器,需啟用 Row Movement |
| Flashback Drop | FLASHBACK TABLE emp TO BEFORE DROP | 從回收筒恢復 DROP TABLE,保留原名或重命名 |
| Flashback Version Query | SELECT ... VERSIONS BETWEEN TIMESTAMP ... | 查看某列在時間區間內的所有歷史版本變更 |
| Flashback Transaction Query | SELECT ... FROM FLASHBACK_TRANSACTION_QUERY | 事務級審計:誰、何時、做了什麼 DML,含 UNDO SQL |
限制與注意事項
- Flashback 無法復原 DDL (除
DROP TABLE 透過回收筒),TRUNCATE、ALTER TABLE 等不可閃回。
- 需足夠 UNDO/Flashback Log 空間,否則舊映像會被覆寫導致
ORA-01555。
- 生產環境謹慎使用
FLASHBACK DATABASE,需完整測試切換流程與 RTO/RPO 驗證。