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

Oracle 11g 閃回資料歸檔 (FDA) 深度解析:從原理到實戰

     編輯:Oracle 資料庫基礎

前言:為什麼需要 FDA?

傳統方案需自建歷史表 + 觸發器,面臨 DDL 同步、觸發器失效、誤刪風險等痛點。Oracle 11g 引入 Flashback Data Archive (FDA),以內核級非同步擷取機制,提供零侵入、自動壓縮、防篡改的歷史資料保留方案。

一、FDA 核心架構與運作原理

1. 背景進程 FBDA

  • 專屬背景進程 FBDA 非同步擷取異動
  • 優先從 Undo 快取讀取;快取無資料則讀 Undo 表空間
  • 將異動列整理後寫入 FDA 歷史表 (內部分區 + 壓縮存儲)

2. 儲存結構

每張啟用 FDA 的表自動對應三張系統表 (命名規則:<owner>.SYS_FBA_<目的>_<object_id>):

表後綴用途
HIST歷史資料主表 (含所有異動列 + 系統欄位 STARTSCN, ENDSCN, OPERATION 等)
TCR異動追蹤登記表
DDLDDL 變更記錄表

3. 自動保留與清理策略

  • 建立多個 FDA,各自指定 RETENTION (如 90 天、1 年、7 年)
  • 多張表可共用同一 FDA (同保留策略)
  • 到期資料由 FBDA 自動清理,不影響線上效能

二、FDA 部署六步驟

1. 建立表空間

CREATE TABLESPACE fbda_ts
DATAFILE '/u01/app/oracle/oradata/ORCL/fbda01.dbf' SIZE 24M;

2. 建立 FDA 管理員並授權

CREATE USER fda_admin IDENTIFIED BY password;
GRANT FLASHBACK ARCHIVE ADMINISTER TO fda_admin;

3. 建立多層次 FDA (不同保留期)

-- 短期 90 天
CREATE FLASHBACK ARCHIVE fda_90d TABLESPACE fbda_ts QUOTA 1G RETENTION 90 DAY;
-- 長期 1 年
CREATE FLASHBACK ARCHIVE fda_1y TABLESPACE fbda_ts QUOTA 5G RETENTION 1 YEAR;
-- 法規 7 年
CREATE FLASHBACK ARCHIVE fda_7y TABLESPACE fbda_ts QUOTA 20G RETENTION 7 YEAR;

4. 授予業務用戶 FDA 使用權限

GRANT FLASHBACK ARCHIVE ON fda_90d TO app_user;
GRANT FLASHBACK ARCHIVE ON fda_1y TO app_user;
GRANT FLASHBACK ARCHIVE ON fda_7y TO app_user;

5. 授予閃回查詢與套件執行權限

GRANT FLASHBACK ANY TABLE TO app_user;
GRANT EXECUTE ON DBMS_FLASHBACK TO app_user;

6. 於目標表啟用 FDA

-- 使用預設 FDA
ALTER TABLE hr.employees FLASHBACK ARCHIVE;

-- 指定特定 FDA
ALTER TABLE hr.departments FLASHBACK ARCHIVE fda_1y;
ALTER TABLE oe.orders FLASHBACK ARCHIVE fda_7y;

三、核心應用場景

1. 稽核歷史異動

SELECT employee_id, salary, VERSIONS_STARTSCN, VERSIONS_OPERATION
FROM hr.employees
VERSIONS BETWEEN TIMESTAMP SYSTIMESTAMP - INTERVAL '30' DAY AND SYSTIMESTAMP
WHERE employee_id = 100;

2. 修復誤刪/誤改資料

-- 刪除錯誤
DELETE FROM hr.applicants WHERE application_date <= TO_DATE('11-10-2008','dd-mm-yyyy');
COMMIT;

-- 利用 FDA 還原
INSERT INTO hr.applicants
SELECT * FROM hr.applicants
VERSIONS BETWEEN TIMESTAMP TO_TIMESTAMP('2008-12-04 10:00','yyyy-mm-dd hh24:mi') AND MAXVALUE
WHERE VERSIONS_OPERATION = 'D';
COMMIT;

3. 歷史資料即時查詢 (AS OF SCN/TIMESTAMP)

SELECT * FROM hr.employees AS OF TIMESTAMP SYSTIMESTAMP - INTERVAL '1' HOUR;

四、維護操作指令

操作指令範例
手動清理指定時間前資料ALTER FLASHBACK ARCHIVE fda_90d PURGE BEFORE TIMESTAMP(SYSTIMESTAMP - INTERVAL '1' DAY);
調整空間配額ALTER FLASHBACK ARCHIVE fda_90d MODIFY TABLESPACE fbda_ts QUOTA 2G;
變更保留期限ALTER FLASHBACK ARCHIVE fda_7y MODIFY RETENTION 90 DAY;
新增表空間擴容ALTER FLASHBACK ARCHIVE fda_90d ADD TABLESPACE fbda_ext_ts;
移除 FDADROP FLASHBACK ARCHIVE fda_90d; (表空間保留)

五、空間不足錯誤與應對

錯誤代碼觸發條件應對
ORA-55617FDA 使用率 ≥ 90%擴充配額或新增表空間
ORA-55623FDA 空間 100% 用盡立即擴容,否則所有啟用表寫入阻塞

六、關鍵限制 (DDL 禁止操作)

啟用 FDA 的表 不可執行:

  • DROP/RENAME/MODIFY COLUMN
  • PARTITION/SUBPARTITION 操作
  • LONG → LOB 轉換
  • DROP/TRUNCATE/RENAME TABLE
  • UPGRADE TABLE

需先 ALTER TABLE ... NO FLASHBACK ARCHIVE 停用 FDA 再執行上述 DDL。

七、最佳實踐建議

  1. 查詢歷史資料前先 COMMIT/ROLLBACK 確保一致性
  2. 優先使用 SCN 定位 (TIMESTAMP_TO_SCN 精度約 3 秒)
  3. 善用 INTERVAL 運算:SYSTIMESTAMP - INTERVAL '20' DAY
  4. 注意 NLS 參數 (語言、字元集) 在歷史資料保留期間可能異動

八、結語

FDA 以內核級非同步擷取、自動壓縮分區、彈性保留策略,徹底解決歷史資料審計與誤操作復原難題。部署簡單、維護自動化,是 Oracle DBA 與開發人員的必備利器。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved