傳統方案需自建歷史表 + 觸發器,面臨 DDL 同步、觸發器失效、誤刪風險等痛點。Oracle 11g 引入 Flashback Data Archive (FDA),以內核級非同步擷取機制,提供零侵入、自動壓縮、防篡改的歷史資料保留方案。
FBDA 非同步擷取異動每張啟用 FDA 的表自動對應三張系統表 (命名規則:<owner>.SYS_FBA_<目的>_<object_id>):
| 表後綴 | 用途 |
|---|---|
| HIST | 歷史資料主表 (含所有異動列 + 系統欄位 STARTSCN, ENDSCN, OPERATION 等) |
| TCR | 異動追蹤登記表 |
| DDL | DDL 變更記錄表 |
RETENTION (如 90 天、1 年、7 年)CREATE TABLESPACE fbda_ts
DATAFILE '/u01/app/oracle/oradata/ORCL/fbda01.dbf' SIZE 24M;
CREATE USER fda_admin IDENTIFIED BY password;
GRANT FLASHBACK ARCHIVE ADMINISTER TO fda_admin;
-- 短期 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;
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;
GRANT FLASHBACK ANY TABLE TO app_user;
GRANT EXECUTE ON DBMS_FLASHBACK TO app_user;
-- 使用預設 FDA
ALTER TABLE hr.employees FLASHBACK ARCHIVE;
-- 指定特定 FDA
ALTER TABLE hr.departments FLASHBACK ARCHIVE fda_1y;
ALTER TABLE oe.orders FLASHBACK ARCHIVE fda_7y;
SELECT employee_id, salary, VERSIONS_STARTSCN, VERSIONS_OPERATION
FROM hr.employees
VERSIONS BETWEEN TIMESTAMP SYSTIMESTAMP - INTERVAL '30' DAY AND SYSTIMESTAMP
WHERE employee_id = 100;
-- 刪除錯誤
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;
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; |
| 移除 FDA | DROP FLASHBACK ARCHIVE fda_90d; (表空間保留) |
| 錯誤代碼 | 觸發條件 | 應對 |
|---|---|---|
| ORA-55617 | FDA 使用率 ≥ 90% | 擴充配額或新增表空間 |
| ORA-55623 | FDA 空間 100% 用盡 | 立即擴容,否則所有啟用表寫入阻塞 |
啟用 FDA 的表 不可執行:
DROP/RENAME/MODIFY COLUMNPARTITION/SUBPARTITION 操作LONG → LOB 轉換DROP/TRUNCATE/RENAME TABLEUPGRADE TABLE需先 ALTER TABLE ... NO FLASHBACK ARCHIVE 停用 FDA 再執行上述 DDL。
COMMIT/ROLLBACK 確保一致性SCN 定位 (TIMESTAMP_TO_SCN 精度約 3 秒)INTERVAL 運算:SYSTIMESTAMP - INTERVAL '20' DAYFDA 以內核級非同步擷取、自動壓縮分區、彈性保留策略,徹底解決歷史資料審計與誤操作復原難題。部署簡單、維護自動化,是 Oracle DBA 與開發人員的必備利器。