Flashback Database 需啟用 FLASHBACK ON 並配置快速恢復區 (FRA)。本文記錄兩種恢復模式實測:資料庫級閃回 (SCN/RESETLOGS) 與表級閃回查詢 (AS OF TIMESTAMP)。
-- 1. 關閉資料庫至 MOUNT
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
-- 2. 閃回至目標 SCN
FLASHBACK DATABASE TO SCN 119272598;
-- 3. 嘗試開啟 (需 RESETLOGS)
ALTER DATABASE OPEN RESETLOGS;
-- 若報 ORA-01610 需使用備份控制檔恢復,見另篇
查詢可恢復 SCN/時間點:
SELECT scn, TO_CHAR(time_dp,'YYYY-MM-DD HH24:MI:SS')
FROM sys.smon_scn_time
ORDER BY time_dp DESC;
不推薦常規使用:資料庫級閃回需停機、RESETLOGS 會切斷歸檔鏈、影響 Data Guard 同步。僅適用於測試環境或極端災難。
利用 AS OF TIMESTAMP / AS OF SCN 子句,將歷史版本資料查出並寫回。
-- 1. 先清空目標表 (避免主鍵衝突)
DELETE FROM t_viradsl2;
-- 2. 從歷史版本插入資料
INSERT INTO t_viradsl2
SELECT * FROM t_viradsl2
AS OF TIMESTAMP TO_DATE('2011-01-19 15:28:00','YYYY-MM-DD HH24:MI:SS');
COMMIT;
亦可用 SCN:
INSERT INTO t_viradsl2
SELECT * FROM t_viradsl2 AS OF SCN 123456789;
| 項目 | 要求 |
|---|---|
| UNDO 保留 | UNDO_RETENTION 需覆蓋目標時間點,否則報 ORA-01555 |
| 表結構 | 閃回期間表結構不得變更 (DDL 會截斷歷史版本) |
| 權限 | 需 FLASHBACK ANY TABLE 或物件 FLASHBACK 權限 |
| 資料類型 | 不支援 BFILE、嵌套表、部分物件型別 |
SELECT xid, operation, logon_user, undo_sql
FROM flashback_transaction_query
WHERE table_name = 'T_VIRADSL2'
AND start_timestamp >= SYSDATE - 1;
可生成反向 SQL (UNDO_SQL) 精準回滾特定異動。
表級閃回查詢是「後悔藥」首選:線上、秒級、無停機、粒度細。資料庫級閃回屬重型武器,謹慎使用。