Flashback Log 与 Flash Recovery Area(FRA)
Flashback Log 与 Flash Recovery Area(FRA)
适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
Flash Recovery Area(FRA,闪回恢复区) 是 Oracle 集中管理恢复相关文件的存储区域[1]:
包含内容:
- 归档 Redo Log
- RMAN 备份集
- Image Copies
- Flashback Logs
- 控制文件自动备份
- SPFILE 自动备份
2. 配置 FRA
2.1 基本配置
-- 配置 FRA 位置和大小
ALTER SYSTEM SET db_recovery_file_dest='/u03/fra' SCOPE=BOTH;
ALTER SYSTEM SET db_recovery_file_dest_size=50G SCOPE=BOTH;
-- 查看配置
SHOW PARAMETER db_recovery_file_dest;
2.2 ASM 配置
-- 推荐 ASM
ALTER SYSTEM SET db_recovery_file_dest='+FRA' SCOPE=BOTH;
ALTER SYSTEM SET db_recovery_file_dest_size=200G SCOPE=BOTH;
2.3 多路复用归档日志
-- 同时归档到 FRA 和另一位置
ALTER SYSTEM SET log_archive_dest_1='LOCATION=USE_DB_RECOVERY_FILE_DEST' SCOPE=BOTH;
ALTER SYSTEM SET log_archive_dest_2='LOCATION=/u04/archive' SCOPE=BOTH;
ALTER SYSTEM SET log_archive_dest_state_1=ENABLE SCOPE=BOTH;
ALTER SYSTEM SET log_archive_dest_state_2=ENABLE SCOPE=BOTH;
3. FRA 空间使用
3.1 查看 FRA 使用情况
SELECT
name,
space_limit/1024/1024/1024 AS limit_gb,
space_used/1024/1024/1024 AS used_gb,
space_reclaimable/1024/1024/1024 AS reclaimable_gb,
number_of_files
FROM v$recovery_file_dest;
-- 按文件类型统计
SELECT
file_type,
percent_space_used,
percent_space_reclaimable,
number_of_files
FROM v$flash_recovery_area_usage;
3.2 FRA 文件类型
| 类型 | 默认位置 |
|---|---|
| 归档日志 | <fra>/<db_unique_name>/archivelog/YYYY_MM_DD/ |
| RMAN 备份集 | <fra>/<db_unique_name>/backupset/YYYY_MM_DD/ |
| Image Copies | <fra>/<db_unique_name>/datafile/ |
| Flashback Log | <fra>/<db_unique_name>/flashback/ |
| 控制文件备份 | <fra>/<db_unique_name>/autobackup/YYYY_MM_DD/ |
4. Flashback Database
4.1 启用 Flashback
-- 1. 数据库必须归档模式
ARCHIVE LOG LIST;
-- 2. 关闭数据库
SHUTDOWN IMMEDIATE;
-- 3. 启动到 MOUNT
STARTUP MOUNT;
-- 4. 启用 Flashback
ALTER DATABASE FLASHBACK ON;
-- 5. 打开数据库
ALTER DATABASE OPEN;
-- 6. 配置保留时间
ALTER SYSTEM SET db_flashback_retention_target=1440 SCOPE=BOTH;
-- 单位:分钟,1440 = 24 小时
4.2 查看 Flashback 状态
SELECT
flashback_on,
flashback_size,
retention_target
FROM v$database;
-- Flashback Log 信息
SELECT
oldest_flashback_scn,
oldest_flashback_time,
retention_target,
estimated_flashback_size
FROM v$flashback_database_log;
-- Flashback 统计
SELECT * FROM v$flashback_database_stat;
4.3 执行 Flashback Database
-- 1. 关闭数据库
SHUTDOWN IMMEDIATE;
-- 2. 启动到 MOUNT
STARTUP MOUNT;
-- 3. 闪回到指定时间
FLASHBACK DATABASE TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' HOUR);
-- 或闪回到 SCN
FLASHBACK DATABASE TO SCN 1234567890;
-- 4. 用 RESETLOGS 打开
ALTER DATABASE OPEN RESETLOGS;
5. Flashback Table
-- 启用行移动
ALTER TABLE employees ENABLE ROW MOVEMENT;
-- 闪回到 1 小时前
FLASHBACK TABLE employees
TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' HOUR);
-- 闪回到 SCN
FLASHBACK TABLE employees TO SCN 1234567890;
-- 闪回多个表
FLASHBACK TABLE employees, departments
TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '30' MINUTE);
6. Flashback Query
-- 闪回查询
SELECT * FROM employees
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' HOUR)
WHERE id = 1;
-- 闪回版本查询(查看所有版本)
SELECT
versions_xid,
versions_starttime,
versions_endtime,
salary
FROM employees
VERSIONS BETWEEN TIMESTAMP
(SYSTIMESTAMP - INTERVAL '1' HOUR) AND SYSTIMESTAMP
WHERE id = 1;
-- 闪回事务查询
SELECT
xid,
operation,
undo_sql
FROM flashback_transaction_query
WHERE table_owner = 'SCOTT'
AND table_name = 'EMPLOYEES';
7. Flashback Data Archive(FDA)
7.1 启用 FDA
-- 1. 创建 FDA 表空间
CREATE TABLESPACE ts_fda DATAFILE '/u01/fda.dbf' SIZE 10G;
-- 2. 创建 FDA
CREATE FLASHBACK ARCHIVE DEFAULT fla_1year
TABLESPACE ts_fda
QUOTA 10G
RETENTION 1 YEAR;
-- 3. 启用表 FDA
ALTER TABLE employees FLASHBACK ARCHIVE fla_1year;
7.2 FDA 长期保留历史数据
-- FDA 自动保留所有变更历史
-- 即使 DELETE 也能查询历史数据
SELECT * FROM employees
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '6' MONTH);
8. FRA 空间管理
8.1 空间不足告警
-- 查看空间使用率
SELECT
ROUND(space_used/space_limit*100, 2) AS used_pct
FROM v$recovery_file_dest;
-- 健康标准:< 80%
8.2 清理空间
-- 1. 过期备份删除
RMAN> DELETE OBSOLETE;
-- 2. 已归档的归档日志删除
RMAN> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';
-- 3. 删除过期备份
RMAN> DELETE EXPIRED BACKUP;
-- 4. 增大 FRA
ALTER SYSTEM SET db_recovery_file_dest_size=100G SCOPE=BOTH;
9. 常见坑与排错
9.1 ORA-19809: limit exceeded for recovery files
现象:FRA 空间满。
排查:
SELECT file_type, percent_space_used, number_of_files
FROM v$flash_recovery_area_usage;
修复:
-- 1. RMAN 清理
RMAN> CROSSCHECK BACKUP;
RMAN> DELETE EXPIRED BACKUP;
RMAN> DELETE OBSOLETE;
RMAN> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';
-- 2. 增大 FRA
ALTER SYSTEM SET db_recovery_file_dest_size=100G SCOPE=BOTH;
9.2 ORA-19815: FRA 缺少空间
现象:归档失败,数据库挂起。
修复:
-- 紧急清理
RMAN> DELETE FORCE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-1';
-- 或临时增加 FRA
ALTER SYSTEM SET db_recovery_file_dest_size=200G SCOPE=BOTH;
9.3 Flashback 失败:ORA-38729
现象:ORA-38729: Not enough flashback database log data。
原因:闪回目标时间超出 Flashback Log 保留范围。
修复:
- 增大
db_flashback_retention_target - 增大 FRA 大小
- 改用不完全恢复(PITR)
9.4 Flashback Log 占用过多 FRA
修复:
-- 调整保留时间
ALTER SYSTEM SET db_flashback_retention_target=720 SCOPE=BOTH;
-- 12 小时
-- 或关闭 Flashback(不推荐)
ALTER DATABASE FLASHBACK OFF;
10. 最佳实践
- FRA 大小充足:至少 3-7 天归档 + 1 次全备
- FRA 与数据文件分开:独立存储
- ASM 配置 FRA:性能与管理最优
- 生产启用 Flashback Database:快速恢复
- 关键表启用 FDA:长期历史保留
- 定期清理过期备份:避免 FRA 满
- 监控 FRA 使用率:< 80% 告警
- RMAN 保留策略合理:
REDUNDANCY 2或RECOVERY WINDOW OF 7 DAYS
11. 参考资料
[1] Oracle Database Backup and Recovery User’s Guide 19c, “Flash Recovery Area” https://docs.oracle.com/en/database/oracle/oracle-database/19/bradv/
[2] Oracle Database Backup and Recovery User’s Guide 19c, “Flashback Database” https://docs.oracle.com/en/database/oracle/oracle-database/19/bradv/flash-database.html