Oracle Flashback Data Archive 详解

Oracle Flashback Data Archive 详解

适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

Flashback Data Archive(FDA)长期保留行历史[1]:

详细见:Oracle Flashback 技术全集


2. 特性

2.1 长期保留

- 不依赖 Undo
- 独立表空间存储
- 保留时间可配置
- 年级

2.2 自动化

- 自动捕获 DML
- 自动管理历史
- 自动清理

2.3 透明

- 应用无感知
- AS OF 查询
- Versions Query

3. 创建

3.1 表空间

CREATE TABLESPACE fda_ts 
  DATAFILE '/u01/oradata/fda01.dbf' SIZE 10G;

3.2 Flashback Archive

CREATE FLASHBACK ARCHIVE DEFAULT fda_1y
  TABLESPACE fda_ts
  QUOTA 10G
  RETENTION 1 YEAR;

CREATE FLASHBACK ARCHIVE fda_5y
  TABLESPACE fda_ts
  QUOTA 50G
  RETENTION 5 YEAR;

3.3 权限

GRANT FLASHBACK ARCHIVE ON fda_1y TO scott;
GRANT FLASHBACK ARCHIVE ADMINISTER TO scott;

4. 启用

4.1 表级

ALTER TABLE employees FLASHBACK ARCHIVE fda_1y;

4.2 默认

ALTER TABLE employees FLASHBACK ARCHIVE;
-- 使用默认 FDA

4.3 禁用

ALTER TABLE employees NO FLASHBACK ARCHIVE;

5. 查询

5.1 AS OF

SELECT * FROM employees 
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' YEAR)
WHERE id = 100;

5.2 VERSIONS

SELECT versions_xid, versions_starttime, versions_operation, salary
FROM employees
VERSIONS BETWEEN TIMESTAMP 
  (SYSTIMESTAMP - INTERVAL '1' YEAR) AND SYSTIMESTAMP
WHERE id = 100;

6. 管理

6.1 查看

SELECT * FROM dba_flashback_archive;
SELECT * FROM dba_flashback_archive_ts;
SELECT * FROM dba_flashback_archive_tables;

6.2 修改

ALTER FLASHBACK ARCHIVE fda_1y 
  SET DEFAULT;

ALTER FLASHBACK ARCHIVE fda_1y 
  RETENTION 2 YEAR;

ALTER FLASHBACK ARCHIVE fda_1y 
  ADD TABLESPACE fda_ts2 QUOTA 20G;

ALTER FLASHBACK ARCHIVE fda_1y 
  PURGE ALL;

ALTER FLASHBACK ARCHIVE fda_1y 
  PURGE BEFORE TIMESTAMP (SYSTIMESTAMP - INTERVAL '6' MONTH);

6.3 删除

DROP FLASHBACK ARCHIVE fda_1y;

7. 内部机制

7.1 FBDA 进程

- Flashback Data Archive 进程
- 异步捕获 DML
- 写入历史表

7.2 历史表

- 系统命名(SYS_FBA_...)
- 包含所有列 + 时间范围
- 自动维护

7.3 查询重写

- AS OF 自动重写到历史表
- 透明

8. 优化

8.1 表空间

- 独立表空间
- 大小充足
- 监控

8.2 索引

- 历史表索引
- 自动

8.3 压缩

- 11g+
- 历史数据压缩
- 节省空间

9. 限制

9.1 DDL

- 部分 DDL 受限
- DROP COLUMN
- RENAME
- 测试

9.2 数据类型

- 大部分支持
- LOB 部分限制

9.3 性能

- DML 开销
- FBDA 异步
- 一般可接受

10. 应用场景

10.1 合规审计

- 金融行业
- 长期保留
- 审计追溯

10.2 历史数据

- 数据演变
- 趋势分析
- 长期查询

10.3 数据恢复

- 误操作恢复
- 不依赖 Undo
- 长时间窗口

10.4 报表

- 历史报表
- 时间点查询
- 透明

11. 监控

11.1 空间

SELECT flashback_archive_name, tablespace_name, quota_in_mb
FROM dba_flashback_archive_ts;

11.2 表

SELECT table_name, flashback_archive_name, archive_table_name, status
FROM dba_flashback_archive_tables;

11.3 FBDA 进程

SELECT * FROM v$session_longops WHERE opname LIKE '%Flashback%';

12. 常见坑与排错

12.1 ORA-55602

- 表空间不足
- 增加配额

12.2 ORA-55608

- 不支持的 DDL
- 检查

12.3 性能

- DML 慢
- FBDA 异步
- 监控

13. 最佳实践

  1. 独立表空间:FDA
  2. 保留时间:业务
  3. 默认 FDA:简化
  4. 权限:受控
  5. 监控:空间
  6. 压缩:节省
  7. 审计:合规
  8. 测试:DDL
  9. 文档:保留策略
  10. 演练:恢复

14. 参考资料

[1] Oracle Database Administrator’s Guide 19c, “Flashback Data Archive” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/