| 版本 | 特性 | 核心能力 |
|---|---|---|
| 9i | Flashback Query | 指定時間點/SCN 查詢過去資料快照(DBMS_FLASHBACK) |
| 10g | Flashback Version Query | 查詢資料列在時間區間內的所有變更歷程(偽欄位 VERSIONS_*) |
| 10g | Flashback Transaction Query | 事務級審計,取得 UNDO_SQL 可回滾已提交事務 |
| 10g | Flashback Table | 將表恢復至過去時間點/SCN(需啟用 ROW MOVEMENT) |
| 10g | Flashback Drop | 回收站機制,DROP TABLE 不物理刪除,可 FLASHBACK TABLE ... TO BEFORE DROP |
| 10g | Flashback Database | 整庫時光機,FLASHBACK DATABASE TO TIMESTAMP/SCN(需 Flashback Logs) |
VERSIONS_STARTSCN / VERSIONS_ENDSCN:變更生效/失效的 SCNVERSIONS_STARTTIME / VERSIONS_ENDTIME:對應時間戳VERSIONS_XID:變更事務 IDVERSIONS_OPERATION:Insert / Update / Delete-- 建表與模擬業務操作
CREATE TABLE rates (currency VARCHAR2(4), rate NUMBER(15,10));
INSERT INTO rates VALUES ('EURO',1.1012); COMMIT;
UPDATE rates SET rate=1.1014; COMMIT;
UPDATE rates SET rate=1.1013; COMMIT;
DELETE FROM rates; COMMIT;
INSERT INTO rates VALUES ('EURO',1.1016); COMMIT;
UPDATE rates SET rate=1.1011; COMMIT;
-- 版本查詢:完整變更歷程
SELECT versions_starttime, versions_endtime, versions_xid,
versions_operation, rate
FROM rates
VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE
ORDER BY versions_starttime;
輸出將顯示 6 筆記錄,含 Insert、Update、Delete、Re-insert 全過程,VERSIONS_ENDTIME 為 NULL 代表當前版本。
SELECT undo_sql
FROM flashback_transaction_query
WHERE xid = '000A000D00000029'; -- 取自 VERSIONS_XID
-- 結果範例
-- INSERT INTO "ANANDA"."RATES"("CURRENCY","RATE") VALUES ('EURO','1.1013');
執行該 UNDO_SQL 即可反向修復該事務的變更。
-- 前置條件
ALTER TABLE test ENABLE ROW MOVEMENT;
-- 恢復表至 30 分鐘前
FLASHBACK TABLE test TO TIMESTAMP SYSDATE - INTERVAL '30' MINUTE;
-- 或指定 SCN
FLASHBACK TABLE test TO SCN 123456789;
DROP TABLE test_drop; -- 進入回收站,重命名為 BIN$...
SHOW RECYCLEBIN; -- 查看回收站內容
FLASHBACK TABLE test_drop TO BEFORE DROP; -- 還原
-- 或指定回收站物件名
FLASHBACK TABLE "BIN$b+XkkO1RS5K10uKo9BfmuA==$0" TO BEFORE DROP;
-- 清除回收站
PURGE TABLE test_drop; -- 單表
PURGE RECYCLEBIN; -- 當前用戶
PURGE DBA_RECYCLEBIN; -- 全庫(需 SYSDBA)
-- 永久刪除不進回收站
DROP TABLE test_drop PURGE;
-- 啟用(需設定快速恢復區)
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE=10G;
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST='/u01/fra';
ALTER DATABASE FLASHBACK ON;
-- 閃回整庫
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
FLASHBACK DATABASE TO TIMESTAMP TO_TIMESTAMP('2024-01-15 14:00:00','YYYY-MM-DD HH24:MI:SS');
ALTER DATABASE OPEN RESETLOGS;
UNDO_MANAGEMENT=AUTO)與足夠 UNDO_RETENTION。FLASHBACK DATABASE 需企業版、啟用 Flashback Logs、資料庫處於 MOUNT 狀態、RESETLOGS 開啟。TRUNCATE、ALTER TABLE DROP COLUMN 等)會中斷版本鏈,無法閃回跨 DDL 的變更。V$UNDOSTAT、V$FLASHBACK_DATABASE_LOG。| 場景 | 推薦特性 |
|---|---|
| 誤刪/誤改幾筆資料,秒級發現 | Flashback Query / Version Query + UNDO_SQL |
| 整張表誤操作,需快速恢復 | Flashback Table |
誤 DROP TABLE | Flashback Drop(回收站) |
| 大批量錯誤變更、邏輯腐壞、測試環境重置 | Flashback Database |
| 合規審計、資料血緣分析 | Flashback Transaction Query |