首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 10g+ Flashback Table 秒級恢復誤 DROP/誤 UPDATE/誤 DELETE 實戰

     編輯:Oracle 資料庫相關知識

核心前提

  • 數據庫版本 ≥ 10g
  • 表所在表空間啟用 RETENTION GUARANTEE (Undo 保留)
  • 參數 DB_FLASHBACK_RETENTION_TARGET (默認 1440 分鐘 = 1 天) 未被縮減
  • 誤操作發生在保留窗口內

場景一:誤 DROP TABLE — 回收站機制

-- 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 僅改名還原,極快。

場景二:誤 UPDATE/DELETE — Flashback Table 到時間點

-- 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 — 無法直接 Flashback Table

TRUNCATE 會釋放段空間並重置 HWM,**不進入回收站**,無法用 FLASHBACK TABLE。
替代方案:
- FLASHBACK DATABASE (需啟用閃回數據庫、有閃回日志)
- RMAN TSPITR (表空間點恢復)
- 邏輯備份導入 (expdp/impdp)

進階:Flashback Query 精準找回少量行

-- 查看 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),大表高峰期慎用。
  • DDL (如 ALTER TABLE ADD COLUMN) 會清空該表的 Flashback Query 歷史版本。
  • 分區表需 FLASHBACK TABLE ... TO BEFORE DROP 逐分區恢復 (12c+ 支持整表)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved