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

Oracle 11g 閃回資料歸檔(Flashback Data Archive)新功能深度解析與實戰部署

     編輯:Oracle 資料庫基礎

一、從手工觸發器到原生 FBDA 的演進

過去需自建 _HISTORY 表 + AFTER ROW 觸發器記錄變更,面臨觸發器被停用、DDL 不同步、誤刪歷史表等風險。11g **Flashback Data Archive (FBDA)** 將歷史保留內建核心,提供:

  • 自動、非同步擷取 Undo 變更寫入壓縮歷史表。
  • DDL 保護:啟用 FBDA 的表**禁止** DROP COLUMN、TRUNCATE、DROP TABLE 等破壞歷史的操作。
  • 保留政策自動清理(依時間或空間配額)。
  • 多租戶支援:不同表可掛載不同保留政策的 Archive。

二、FBDA 架構與運作流程

  1. 背景程序 FBDA 定期喚醒。
  2. 讀取記憶體 Undo 或 Undo 表空間的變更向量。
  3. 整理為行級變更,寫入系統自動建立的歷史表(SYS_FBA_HIST_<obj#>、SYS_FBA_TCRV_<obj#>、SYS_FBA_DDL_COLMAP_<obj#>)。
  4. 歷史資料以 **Advanced Compression** 壓縮儲存,節省空間。

三、部署步驟完整腳本

-- 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 釋放。
  • Alert.log 同步記錄,建立監控腳本發送告警。

八、限制與最佳實踐

限制項目說明
DDL 限制啟用 FBDA 的表禁止 DROP COLUMN、RENAME COLUMN、TRUNCATE、DROP TABLE、PARTITION 操作等
NLS 環境歷史資料寫入時使用當下 Session NLS 設定,查詢時可能不一致
精確時間點建議用 SCN(TIMESTAMP_TO_SCN)而非 Timestamp,精度約 3 秒
索引不保留歷史表不含原表索引,需自行建立

最佳實踐: 查詢前先 COMMIT 確保一致性;善用 INTERVAL 運算;關鍵審計表掛載長期 Archive;定期驗證 PURGE 執行狀況。

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