RETENTION GUARANTEE (Undo 保留)DB_FLASHBACK_RETENTION_TARGET (默認 1440 分鐘 = 1 天) 未被縮減-- 1. 確認回收站對象
SELECT object_name, original_name, type, droptime
FROM user_recyclebin;
-- 2. 一鍵恢復
FLASHBACK TABLE test003 TO BEFORE DROP;
-- 3. 驗證
SELECT * FROM test003;
原理: DROP TABLE 不立即釋放空間,而是重命名為 BIN$...==$0 移入回收站,元數據保留在 USER_RECYCLEBIN。FLASHBACK TABLE ... TO BEFORE DROP 僅改名還原,極快。
-- 1. 必須先啟用行移動 (允許行在塊間移動以還原舊版本)
ALTER TABLE emp ENABLE ROW MOVEMENT;
-- 2. 指定時間點恢復 (至誤操作前)
FLASHBACK TABLE emp TO TIMESTAMP TO_TIMESTAMP('2024-01-15 10:30:00','YYYY-MM-DD HH24:MI:SS');
-- 3. 驗證
SELECT * FROM emp;
常見報錯: ORA-08189: cannot flashback the table because row movement is not enabled → 執行步驟 1 即可。
TRUNCATE 會釋放段空間並重置 HWM,**不進入回收站**,無法用 FLASHBACK TABLE。
替代方案:
- FLASHBACK DATABASE (需啟用閃回數據庫、有閃回日志)
- RMAN TSPITR (表空間點恢復)
- 邏輯備份導入 (expdp/impdp)
-- 查看 30 分鐘前的數據
SELECT * FROM emp AS OF TIMESTAMP SYSTIMESTAMP - INTERVAL '30' MINUTE;
-- 基於 SCN 精確定位
SELECT * FROM emp AS OF SCN 1234567890;
-- 將查出的舊數據合併回當前表
MERGE INTO emp t
USING (SELECT * FROM emp AS OF TIMESTAMP ...) s
ON (t.empno = s.empno)
WHEN MATCHED THEN UPDATE SET t.sal = s.sal, t.comm = s.comm
WHEN NOT MATCHED THEN INSERT (empno, ename, sal, comm) VALUES (s.empno, s.ename, s.sal, s.comm);
SHOW PARAMETER db_flashback_retention_target;
-- 動態調整 (單位:分鐘)
ALTER SYSTEM SET db_flashback_retention_target = 2880 SCOPE=BOTH; -- 2 天
-- 監控 Undo 保留情況
SELECT maxquerylen, maxquerysqlid, tuned_undoretention
FROM v$undostat
ORDER BY begin_time DESC;
PURGE RECYCLEBIN 或 PURGE TABLESPACE users 釋放。FLASHBACK TABLE 需排他鎖 (TM),大表高峰期慎用。ALTER TABLE ADD COLUMN) 會清空該表的 Flashback Query 歷史版本。FLASHBACK TABLE ... TO BEFORE DROP 逐分區恢復 (12c+ 支持整表)。