首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 教學

Oracle Flashback 閃回技術完整指南:原理、配置與實戰恢復

     編輯:Oracle 教學

Oracle Flashback 閃回技術完整指南:原理、配置與實戰恢復

核心前置條件

  1. UNDO_RETENTION:必須設定足夠大的保留時間 (秒),確保所需歷史版本未被覆寫。
    ALTER SYSTEM SET UNDO_RETENTION = 3600; -- 例: 1 小時
  2. Flashback 查詢範圍受限於 Undo Retention 區間。

DBMS_FLASHBACK 套件關鍵程序

程序用途
ENABLE_AT_TIME會話級啟用閃回,指定時間戳 (自動對應最近 SCN)
ENABLE_AT_SYSTEM_CHANGE_NUMBER會話級啟用閃回,指定 SCN
GET_SYSTEM_CHANGE_NUMBER取得當前 SCN
DISABLE關閉會話閃回,返回當前時間

注意事項:

  • 不可在活躍事務中呼叫 ENABLE 系列程序
  • SYS 用戶不可直接執行此套件
  • 執行前需設定 NLS_DATE_FORMAT 含時分秒 (預設僅精確到日)

Timestamp 與 SCN 映射機制

  • Oracle 內部以 SCN 為基準,AS OF TIMESTAMP 會自動轉換為 SCN
  • 映射表:SYS.SMON_SCN_TIME (每 5 分鐘記錄一次,保留最近 1440 筆 ≈ 5 天)
  • 10g 新增轉換函數:SCN_TO_TIMESTAMP()、TIMESTAMP_TO_SCN()
-- 查看映射表
SELECT scn, TO_CHAR(time_dp,'yyyy-mm-dd hh24:mi:ss') FROM sys.smon_scn_time;

-- 時間轉 SCN 範例
SELECT TIMESTAMP_TO_SCN(TO_TIMESTAMP('2010-10-19 21:00:00','YYYY-MM-DD HH24:MI:SS')) FROM dual;

實戰演示:誤刪資料閃回恢復

-- 1. 確認資料筆數
SELECT COUNT(*) FROM t1;  -- 8302

-- 2. 誤刪並提交
DELETE FROM t1; COMMIT;

-- 3. 取得刪除前 SCN (或用 TIMESTAMP_TO_SCN 推估)
SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM dual; -- 假設 1482649

-- 4. 閃回查詢驗證
SELECT COUNT(*) FROM t1 AS OF SCN 1482600; -- 8302 筆皆在

-- 5. 兩種恢復方式
-- 方式 A: INSERT ... AS OF SCN
INSERT INTO t1 SELECT * FROM t1 AS OF SCN 1482600; COMMIT;

-- 方式 B: FLASHBACK TABLE (10g+)
FLASHBACK TABLE t1 TO SCN 1482600; COMMIT;

-- 針對 DROP TABLE 的恢復
FLASHBACK TABLE t1 TO BEFORE DROP; COMMIT;

最佳實踐建議

  • 生產庫設定 UNDO_RETENTION 至少覆蓋業務容許的最大恢復窗口 (建議 24h+)
  • 配合 GUARANTEE 選項避免 Undo 被強制覆寫
  • 定期驗證 SMON_SCN_TIME 記錄完整性
  • 大表誤刪優先用 FLASHBACK TABLE,避免全量 INSERT 產生大量 Redo
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved