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. 最佳实践

  1. FRA 大小充足:至少 3-7 天归档 + 1 次全备
  2. FRA 与数据文件分开:独立存储
  3. ASM 配置 FRA:性能与管理最优
  4. 生产启用 Flashback Database:快速恢复
  5. 关键表启用 FDA:长期历史保留
  6. 定期清理过期备份:避免 FRA 满
  7. 监控 FRA 使用率:< 80% 告警
  8. RMAN 保留策略合理REDUNDANCY 2RECOVERY 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