ora-19809错误根本原因是fra逻辑配额(db_recovery_file_dest_size)耗尽,而非物理磁盘满;须查v$recovery_file_dest确认实际使用率,再通过rman清理过期归档或扩容配额解决。
ora-19809 不是磁盘满了,而是 oracle 快速恢复区(fra)的逻辑配额被耗尽了——哪怕 /u01 还剩 50g,只要 db_recovery_file_dest_size 设的是 4g 且已写满,rman 就会直接报错退出。
查清 FRA 实际使用情况和限制值
别猜,先看真实数据。数据库能连上时,用 SQL 查三件事:
-
v$recovery_file_dest显示当前 FRA 路径和SPACE_LIMIT(即db_recovery_file_dest_size的字节数) -
v$flash_recovery_area_usage显示各类文件(ARCHIVELOG、BACKUPPIECE、FLASHBACK、FOREIGN_ARCHIVE 等)各自占了多少百分比 -
show parameter db_recovery_file_dest和show parameter db_recovery_file_dest_size确认参数是否生效(scope是both还是memory)
如果数据库启不来,就去操作系统里翻 alert 日志:tail -n 50 $ORACLE_BASE/diag/rdbms/*/trace/alert_*.log,找 ORA-19815 行——它会明确告诉你“已使用 100.00%,尚有 0 字节可用”。
RMAN 删除过期归档日志最安全
临时腾空间,优先用 RMAN 清理归档日志,而不是手动 rm。因为手动删会破坏控制文件里的记录,下次 RMAN 可能报 ORA-19625(找不到归档文件)或备份失败。
- 进 RMAN:运行
rman target / - 确认哪些归档可删:
list archivelog all;或按时间范围查,比如list archivelog from time 'sysdate-7'; - 真正删除(带确认):
delete archivelog until time 'sysdate-3'; - 强制清理所有但保留最近 1 天的:
delete archivelog all completed before 'sysdate-1';
注意:如果设置了 RMAN 保留策略(如 CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;),DELETE OBSOLETE; 也能自动清理,但它只删“不再用于恢复”的备份和归档,不一定立刻释放大量空间。
调整 db_recovery_file_dest_size 要谨慎
加大小不是万能解法,得结合物理磁盘余量和业务节奏来定。
- 设太小(比如默认 2G/4G):高事务库几天就满,治标不治本
- 设太大(比如 100G)但磁盘本身只剩 20G:Oracle 启动时会检查物理空间,仍可能因
ORA-19809拒绝归档,甚至实例崩溃 - 执行命令:
alter system set db_recovery_file_dest_size = 10g scope=both;—— 必须加scope=both才持久化,否则重启后还原 - 改完立刻查
v$recovery_file_dest确认SPACE_LIMIT已更新,再跑crosscheck archivelog all;+delete expired archivelog all;同步元数据
根本规避:检查归档路径和保留策略
长期靠手动清理或硬调参数,说明架构没对齐实际负载。两个关键点常被忽略:
- 归档目的地是否真在 FRA?查
archive log list,如果Archive destination是USE_DB_RECOVERY_FILE_DEST,那所有归档都挤在 FRA;若业务允许,可改用非 FRA 路径:alter system set log_archive_dest_1='LOCATION=/arch' scope=both; - RMAN 归档日志删除策略是否启用?默认不自动删。应显式配置:
configure archivelog deletion policy to applied on standby;(有备库)或to backed up 1 times to device type disk;(本地备份后自动删)
FRA 不是垃圾桶,是受控缓存区。空间告警背后,往往是归档生成速度远超备份/清理节奏,或是备份任务长期失败却没人看 RMAN log。最危险的操作,是看到 ORA-19809 就只加 db_recovery_file_dest_size,却不查 v$flash_recovery_area_usage 里哪类文件占了 95%——万一全是没删干净的旧备份片,加再大也白搭。











