FRA空间占满主因是未按归档速率与保留策略动态计算大小,DB_RECOVERY_FILE_DEST_SIZE须根据每小时归档量×保留时长×1.2缓冲精确估算,硬设固定值如50G极易引发ORA-19809和归档挂起。

闪回区(FRA)空间占满不是配置不到位,而是没按归档速率+保留策略动态算大小,硬塞一个“看着够”的值必然爆盘。
DB_RECOVERY_FILE_DEST_SIZE 必须按归档速率估算,不能拍脑袋
设 DB_RECOVERY_FILE_DEST_SIZE = 50G 看似很大,但如果数据库每小时生成 3GB 归档日志,RMAN 保留窗口设为 7 天,又要求能闪回到最近 24 小时——实际需要空间 ≈ 3GB/h × 24h(闪回日志) + 3GB/h × 168h(归档) × 1.2(缓冲) ≈ 650GB。盲目设小,ORA-19809 和归档挂起就是直接后果。
- 查当前归档速率:
SELECT TRUNC(COMPLETION_TIME), SUM(BLOCKS*BLOCK_SIZE)/1024/1024/1024 GB FROM V$ARCHIVED_LOG GROUP BY TRUNC(COMPLETION_TIME) ORDER BY 1 DESC; - 查 FRA 实际使用率:
SELECT SPACE_LIMIT/1024/1024/1024 "LIMIT_GB", SPACE_USED/1024/1024/1024 "USED_GB", PERCENT_SPACE_USED FROM V$RECOVERY_FILE_DEST;—— 别信df -h,Oracle 内部预留约 15% 管理开销 - 设大小时先执行:
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE = <计算值>G SCOPE=BOTH;,再设路径;顺序反了会报ORA-32001
LOG_ARCHIVE_DEST_1 必须清空并强制走 FRA,否则归档乱写
只要 LOG_ARCHIVE_DEST_1 指向非 FRA 路径(比如 /arch),Oracle 就会优先往那里写归档,FRA 只收一部分甚至完全不收。结果就是 RMAN 找不到归档、还原时报 RMAN-06023,而你还在盯着 FRA 磁盘看。
- 必须分两步清掉原路径:
ALTER SYSTEM SET LOG_ARCHIVE_DEST_1 = '' SCOPE=BOTH;,再ALTER SYSTEM SET LOG_ARCHIVE_DEST_1 = 'LOCATION=USE_DB_RECOVERY_FILE_DEST' SCOPE=BOTH; - 确认归档格式含
%r(resetlogs ID):SHOW PARAMETER log_archive_format,应类似%t_%s_%r.dbf;缺%r会导致跨 incarnation 时归档被误删 - 立即触发一次归档:
ALTER SYSTEM ARCHIVE CURRENT LOG;,再查SELECT NAME FROM V$ARCHIVED_LOG WHERE ROWNUM < 3;,确保路径落在DB_RECOVERY_FILE_DEST下
归档日志不会自动清理,得配删除策略并手动触发
FRA 空间不会因为“过期”就自动释放。Oracle 只在两个条件同时满足时才删归档:已成功备份到 RMAN 目标(如磁盘或磁带)且 超出 ARCHIVELOG DELETION POLICY 定义的窗口。单机库没配 RMAN 备份?归档永远堆积。
- 查当前策略:
SHOW ARCHIVELOG DELETION POLICY;,默认是TO APPLIED ON STANDBY或BACKED UP 1 TIMES TO DEVICE TYPE DISK - 若无备库也无磁带,可临时改策略:
CONFIGURE ARCHIVELOG DELETION POLICY TO BACKED UP 1 TIMES TO DISK;(慎用,确保 RMAN 真备份成功) - 强制清理过期归档(需先同步元数据):
RMAN TARGET /→CROSSCHECK ARCHIVELOG ALL;→DELETE NOPROMPT ARCHIVELOG UNTIL TIME 'SYSDATE-3'; - 注意:
DELETE ARCHIVELOG默认只删文件,不更新控制文件记录;必须跟CROSSCHECK+DELETE EXPIRED才能让V$RECOVERY_FILE_DEST.SPACE_USED降下来
FLASHBACK DATABASE 启用后,闪回日志生命周期不受 RMAN 控制
很多人以为配了 CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS,闪回日志也会自动留 7 天——错。RMAN 的保留策略只管 backupsets 和 archived logs,flashback logs 的存留完全由 FRA 空间压力驱动:FRA 满了,Oracle 就删最老的 flashback log 来腾地方,不管 DB_FLASHBACK_RETENTION_TARGET 设的是 1440 还是 10080 分钟。
-
DB_FLASHBACK_RETENTION_TARGET(默认 1440 分钟)只是“建议值”,不是保证值;真正起作用的是 FRA 剩余空间和归档写入速率 - 查闪回日志占用:
SELECT * FROM V$FLASHBACK_DATABASE_LOG;,重点关注OLDEST_FLASHBACK_SCN和RETENTION_TARGET是否匹配 - 如果发现
OLDEST_FLASHBACK_SCN对应时间远小于预期,说明 FRA 空间不足或归档写得太猛,得扩容或调低DB_FLASHBACK_RETENTION_TARGET
最常被忽略的一点:所有参数修改后,SCOPE=BOTH 不等于热生效。DB_RECOVERY_FILE_DEST 和 DB_RECOVERY_FILE_DEST_SIZE 必须重启数据库才真正加载,否则 ALTER DATABASE FLASHBACK ON 表面成功,实际无法生成闪回日志,后续 FLASHBACK DATABASE 一定报 ORA-38729。


















