人為誤操作(誤刪表、誤更新、誤提交)是資料庫營運最大風險之一。傳統備份恢復耗時長、粒度粗。Oracle 閃回技術基於 Undo 資料,提供秒級、精細粒度的還原能力,無需傳統恢復流程。本文系統梳理四大閃回類型、語法、權限需求與實戰範例。
| 維度 | 傳統恢復 | 閃回技術 |
|---|---|---|
| 速度 | 慢(全庫/檔案級) | 快(僅變更塊/行級) |
| 粒度 | 粗 | 細(行、事務、表、表空間) |
| 複雜度 | 多步驟、易出錯 | 單一指令、聲明式 |
| 依賴 | 備份集、歸檔日誌 | Undo 表空間、閃回日誌 |
DROP TABLE 的表。FLASHBACK ANY TABLE 權限。ALTER TABLE t ENABLE ROW MOVEMENT;UNDO_RETENTION)需覆蓋目標時間點。FLASHBACK TABLE [schema.]table_name
TO { TIMESTAMP expr | SCN expr }
[ENABLE | DISABLE] TRIGGERS;
-- 1. 記錄操作前 SCN
SELECT TO_CHAR(SYSDATE,'yyyy-mm-dd hh24:mi:ss') ts, TIMESTAMP_TO_SCN(SYSDATE) scn FROM DUAL;
-- 假設 SCN = 1066413
-- 2. 建表、插入、刪除、提交
CREATE TABLE flashback_table (fid NUMBER, fname VARCHAR2(20));
INSERT INTO flashback_table VALUES (1,'Tom');
INSERT INTO flashback_table VALUES (2,'Mary');
INSERT INTO flashback_table VALUES (3,'Mike');
COMMIT;
DELETE FROM flashback_table WHERE fid=2; COMMIT;
-- 3. 直接閃回失敗(未啟用行移動)
FLASHBACK TABLE flashback_table TO SCN 1066413;
-- ORA-08189
-- 4. 啟用行移動後閃回成功
ALTER TABLE flashback_table ENABLE ROW MOVEMENT;
FLASHBACK TABLE flashback_table TO SCN 1066413;
-- 閃回完成,資料恢復
DROP TABLE 實為重命名移入回收站(BIN$globalUID$version)。PURGE RECYCLEBIN 或 DROP TABLE ... PURGE 可永久刪除。SHOW RECYCLEBIN 或查詢 DBA_RECYCLEBIN。-- 使用原表名閃回(最近被 DROP 的同名表)
FLASHBACK TABLE test3 TO BEFORE DROP;
-- 使用回收站物件名閃回(需雙引號)
FLASHBACK TABLE "BIN$V2swGcDdROGeCxvlh9SA3A==$0" TO BEFORE DROP;
-- 重名表處理:閃回並重命名
FLASHBACK TABLE test3 TO BEFORE DROP RENAME TO test3_new;
SELECT column_list
FROM table_name
VERSIONS BETWEEN {SCN | TIMESTAMP} [expr | MINVALUE]
AND [expr | MAXVALUE]
[AS OF {SCN | TIMESTAMP} expr];
VERSIONS_STARTSCN / VERSIONS_STARTTIME:版本生效起點VERSIONS_ENDSCN / VERSIONS_ENDTIME:版本失效終點VERSIONS_OPERATION:I(INSERT)/U(UPDATE)/D(DELETE)VERSIONS_XID:關聯事務 IDSELECT vid, vname,
versions_operation,
versions_starttime,
versions_endtime
FROM versions_table
VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE
ORDER BY 1,4;
/* 結果顯示:
VID VNAME V START_TIME END_TIME
1 Tom I 29-MAR-12 11:07:26
2 Mary I 29-MAR-12 11:07:41 29-MAR-12 11:08:26
2 Mary123 U 29-MAR-12 11:08:26
3 Mike I 29-MAR-12 11:07:53
*/
需 SELECT ANY TRANSACTION 權限。關鍵欄位:
XID、START_SCN/TIMESTAMP、COMMIT_SCN/TIMESTAMPOPERATION、TABLE_NAME、ROW_IDUNDO_SQL:可直接執行的撤銷語句VERSIONS_XID。FLASHBACK_TRANSACTION_QUERY 取得 UNDO_SQL。UNDO_SQL 完成事務回滾。-- 1. 取得事務 XID
SELECT tid, tname, versions_operation, versions_xid
FROM transaction_table
VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE;
-- 2. 查詢撤銷 SQL
SELECT operation, undo_sql
FROM flashback_transaction_query
WHERE xid = '08000F00B8010000';
/* 輸出:
OPERATION UNDO_SQL
UPDATE update "SCOTT"."TRANSACTION_TABLE" set "TNAME"='Mary' where ROWID='AAAM6vAAEAAAALtAAB';
INSERT delete from "SCOTT"."TRANSACTION_TABLE" where ROWID='AAAM6vAAEAAAALtAAC';
BEGIN
*/
-- 3. 執行撤銷
UPDATE "SCOTT"."TRANSACTION_TABLE" SET "TNAME"='Mary' WHERE ROWID='AAAM6vAAEAAAALtAAB';
DELETE FROM "SCOTT"."TRANSACTION_TABLE" WHERE ROWID='AAAM6vAAEAAAALtAAC';
COMMIT;
UNDO_RETENTION,確保閃回窗口覆蓋業務容忍度(建議 ≥ 24 小時)。ENABLE ROW MOVEMENT。PURGE RECYCLEBIN 避免佔用空間;生產庫建議 DROP TABLE ... PURGE 習慣。TRUNCATE、大範圍誤操作等極端場景。