ora-19809表示rman写入fra时超出db_recovery_file_dest_size配额限制,本质是参数值过小导致的硬性拒绝,而非物理磁盘满;需先查v$recovery_file_dest和v$flash_recovery_area_usage定位瓶颈,再结合rman清理与保留策略优化,而非盲目扩容。
ora-19809 是什么,为什么和 db_recovery_file_dest_size 有关
ora-19809 表示 rman 尝试写入归档日志、控制文件快照或备份片时,超出了快速恢复区(fra)的配额限制。根本原因不是磁盘空间不足,而是 db_recovery_file_dest_size 参数设得太小,rman 拒绝写入——哪怕物理磁盘还有上百 gb 空闲。
这个参数是硬限制,RMAN 不会自动突破它,也不会警告后降级写入;直接报错并中断备份流程。
怎么查当前 FRA 使用情况和瓶颈点
别急着调大 DB_RECOVERY_FILE_DEST_SIZE,先确认是不是真被占满了,还是有大量可回收文件没清理:
- 运行
SELECT * FROM V$RECOVERY_FILE_DEST;查看SPACE_LIMIT(即当前DB_RECOVERY_FILE_DEST_SIZE值)、SPACE_USED和NUMBER_OF_FILES - 查哪些文件最占空间:
SELECT FILE_TYPE, PERCENT_SPACE_USED FROM V$FLASH_RECOVERY_AREA_USAGE;—— 特别关注ARCHIVED LOG和BACKUP PIECE是否长期未清理 - 检查是否有过期备份未删除:
LIST EXPIRED BACKUP;+CROSSCHECK BACKUP;+DELETE EXPIRED BACKUP;
调整 DB_RECOVERY_FILE_DEST_SIZE 的安全操作步骤
直接改参数不等于立刻生效,必须配合实际磁盘空间和归档策略,否则可能引发更严重的归档挂起(ARCHIVE LOG FULL):
- 确认底层文件系统有足够空闲空间(至少比目标
DB_RECOVERY_FILE_DEST_SIZE多出 10%) - 用
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE = 20G SCOPE=BOTH;(单位必须是字节,支持 G / M,如20G) - 执行后立即查
V$RECOVERY_FILE_DEST,确认SPACE_LIMIT已更新;若没变,说明SCOPE=SPFILE但未重启,而SCOPE=BOTH要求实例支持动态修改(Oracle 10gR2+ 支持,但某些 RAC 场景需注意) - 如果数据库处于
MOUNT状态,该参数无法动态修改,必须先STARTUP MOUNT→ALTER SYSTEM→ALTER DATABASE OPEN
比调大更推荐的长期解法:清理 + 保留策略优化
盲目扩大 DB_RECOVERY_FILE_DEST_SIZE 只是掩盖问题。真正健壮的做法是让 FRA 自动循环利用:
- 设置 RMAN 保留策略,例如:
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;,再配合DELETE OBSOLETE;定期清理 - 关闭归档日志的自动删除开关(默认开启)会导致归档堆积:
SHOW ALL;查ARCHIVELOG DELETION POLICY,推荐设为TO APPLIED ON STANDBY或BACKED UP 1 TIMES TO DEVICE TYPE DISK - 如果使用了 Data Guard,主库归档在备库应用完成后,主库 FRA 才能释放对应归档——务必确认备库同步状态(
SELECT STATUS, GAP_STATUS FROM V$ARCHIVE_DEST_STATUS WHERE DEST_ID=2;)
FRA 空间管理本质是“策略驱动”,不是容量堆砌。参数值设得再大,没有清理机制和归档流转保障,迟早再次触发 ORA-19809。











