過去需自建 _HISTORY 表 + AFTER ROW 觸發器記錄變更,面臨觸發器被停用、DDL 不同步、誤刪歷史表等風險。11g **Flashback Data Archive (FBDA)** 將歷史保留內建核心,提供:
DROP COLUMN、TRUNCATE、DROP TABLE 等破壞歷史的操作。FBDA 定期喚醒。SYS_FBA_HIST_<obj#>、SYS_FBA_TCRV_<obj#>、SYS_FBA_DDL_COLMAP_<obj#>)。-- 1. 建立表空間
CREATE TABLESPACE fbda_tbs DATAFILE '/u01/app/oracle/oradata/ORCL/fbda01.dbf' SIZE 1G AUTOEXTEND ON;
-- 2. 建立 FBDA 管理員
CREATE USER fbda_admin IDENTIFIED BY fbda_admin;
GRANT FLASHBACK ARCHIVE ADMINISTER TO fbda_admin;
-- 3. 建立不同保留政策的 Archive
CREATE FLASHBACK ARCHIVE fba_90d TABLESPACE fbda_tbs QUOTA 10G RETENTION 90 DAY;
CREATE FLASHBACK ARCHIVE fba_1y TABLESPACE fbda_tbs QUOTA 50G RETENTION 1 YEAR;
CREATE FLASHBACK ARCHIVE fba_7y TABLESPACE fbda_tbs QUOTA 200G RETENTION 7 YEAR; -- 法規需求
-- 4. 授權業務用戶使用特定 Archive
GRANT FLASHBACK ARCHIVE ON fba_90d TO hr, oe, sh;
GRANT FLASHBACK ARCHIVE ON fba_1y TO hr, oe;
GRANT FLASHBACK ARCHIVE ON fba_7y TO hr;
-- 5. 針對表啟用 FBDA
ALTER TABLE hr.applicants FLASHBACK ARCHIVE fba_90d; -- 短期查詢
ALTER TABLE hr.departments FLASHBACK ARCHIVE fba_1y; -- 中期審計
ALTER TABLE oe.customers FLASHBACK ARCHIVE fba_7y; -- 長期法規
-- 6. 切換預設 Archive(可選)
ALTER FLASHBACK ARCHIVE fba_1y SET DEFAULT;
-- 1. AS OF TIMESTAMP:某時間點快照
SELECT * FROM hr.applicants AS OF TIMESTAMP SYSTIMESTAMP - INTERVAL '1' DAY;
-- 2. VERSIONS BETWEEN:行級變更歷程
SELECT applicant_id, salary_desired, VERSIONS_STARTSCN, VERSIONS_ENDSCN, VERSIONS_OPERATION
FROM hr.applicants
VERSIONS BETWEEN TIMESTAMP SYSTIMESTAMP - INTERVAL '7' DAY AND SYSTIMESTAMP
WHERE applicant_id = 123;
-- 3. 直接查系統歷史表(除錯用)
SELECT * FROM hr.SYS_FBA_HIST_73218 WHERE applicant_id < 10 ORDER BY endscn;
-- 情境:誤刪 2008-11-10 前的申請資料
DELETE FROM hr.applicants WHERE application_date <= DATE '2008-11-10';
COMMIT;
-- 修復:從 FBDA 找回被刪除的行並重新插入
INSERT INTO hr.applicants
SELECT * FROM hr.applicants
VERSIONS BETWEEN TIMESTAMP TIMESTAMP '2008-12-04 10:00:00' AND MAXVALUE
WHERE VERSIONS_OPERATION = 'D'; -- 只取 Delete 操作的舊映像
COMMIT;
-- 擴充配額
ALTER FLASHBACK ARCHIVE fba_90d MODIFY TABLESPACE fbda_tbs QUOTA 20G;
-- 新增表空間擴充存儲
CREATE TABLESPACE fbda_ext DATAFILE '/u01/app/oracle/oradata/ORCL/fbda_ext01.dbf' SIZE 50G;
ALTER FLASHBACK ARCHIVE fba_90d ADD TABLESPACE fbda_ext;
-- 縮減保留期限
ALTER FLASHBACK ARCHIVE fba_7y MODIFY RETENTION 5 YEAR;
-- 手動清理指定時間前的歷史
ALTER FLASHBACK ARCHIVE fba_90d PURGE BEFORE TIMESTAMP SYSTIMESTAMP - INTERVAL '30' DAY;
-- 移除 Archive(表空間保留)
DROP FLASHBACK ARCHIVE fba_90d;
ORA-55617:Archive 空間使用率 ≥ 90%,追蹤暫停。→ 擴充配額或新增表空間。ORA-55623:空間 100% 用盡,所有表追蹤阻塞。→ 緊急擴充或 PURGE 釋放。| 限制項目 | 說明 |
|---|---|
| DDL 限制 | 啟用 FBDA 的表禁止 DROP COLUMN、RENAME COLUMN、TRUNCATE、DROP TABLE、PARTITION 操作等 |
| NLS 環境 | 歷史資料寫入時使用當下 Session NLS 設定,查詢時可能不一致 |
| 精確時間點 | 建議用 SCN(TIMESTAMP_TO_SCN)而非 Timestamp,精度約 3 秒 |
| 索引不保留 | 歷史表不含原表索引,需自行建立 |
最佳實踐: 查詢前先 COMMIT 確保一致性;善用 INTERVAL 運算;關鍵審計表掛載長期 Archive;定期驗證 PURGE 執行狀況。