ORA-19809报错本质是db_recovery_file_dest_size逻辑配额耗尽,而非磁盘物理空间不足;需查v$recovery_file_dest确认FRA实际使用率,再通过CROSSCHECK、DELETE OBSOLETE或扩容参数解决。

ORA-19809 报错本质不是磁盘满,而是 db_recovery_file_dest_size 逻辑配额耗尽 —— 即使 df -h 显示还有几十 GB 空闲,RMAN 仍会拒绝写入。
查清 FRA 实际使用率,别信 df -h
操作系统层面的磁盘剩余和 Oracle 的闪回恢复区(FRA)空间是两回事。FRA 由参数 db_recovery_file_dest_size 控制上限,超限即报 ORA-19809/ORA-19804。
- 连数据库执行:
SELECT name, space_limit/1024/1024/1024 AS "GB Limit", space_used/1024/1024/1024 AS "GB Used", ROUND(space_used/space_limit*100, 2) AS "Pct Used" FROM v$recovery_file_dest;
- 重点看
Pct Used是否 ≥ 95%,以及name字段指向的真实路径(确认该路径所在文件系统确实有物理空间) -
SHOW PARAMETER db_recovery_file_dest只显示配置路径,不反映实际占用;df -h看的是挂载点总空间,不是 FRA 配额 —— 这俩都不可靠
RMAN 清理过期/冗余文件,比扩容更快
清理优先于调参,尤其在紧急恢复或启动失败时。顺序错误会导致“删了也无效”。
- 先做交叉校验:
CROSSCHECK ARCHIVELOG ALL和CROSSCHECK BACKUP—— 把 OS 层已删但控制文件还记着的归档/备份标为EXPIRED - 再删过期项:
DELETE EXPIRED ARCHIVELOG ALL(只删标记为 EXPIRED 的),或DELETE OBSOLETE(按当前 RMAN 保留策略删真正过期的) - 慎用强制清理:
DELETE ARCHIVELOG UNTIL TIME 'SYSDATE-7'—— 业务允许丢 7 天归档才用,否则可能影响 PITR - 清理后必须运行:
LIST RECOVERY AREA确认空间释放,别只看 DELETE 输出的 “deleted”
临时扩容 db_recovery_file_dest_size(需重启或动态生效)
清理后仍不够用,才调大配额。注意生效方式:
- 若数据库能 mount:
ALTER SYSTEM SET db_recovery_file_dest_size = 20G SCOPE=BOTH;
(SCOPE=BOTH同时改内存和 spfile) - 若数据库起不来(如报 ORA-03113):先
STARTUP MOUNT,再执行 ALTER SYSTEM,最后ALTER DATABASE OPEN - 如果 FRA 路径在 ASM 上,还得确认对应 diskgroup(如
v$asm_diskgroup)有足够free_mb,否则扩了也写不进
容易被忽略的归档路径冲突
即使 FRA 有空间,如果手动设了 log_archive_dest_1 指向其他目录且该目录满了,也会连锁触发 ORA-19809 —— 因为归档失败后,Oracle 会尝试 fallback 到 FRA,导致 FRA 瞬间爆满。
- 查归档目标状态:
ARCHIVE LOG LIST
,看Archive destination是否ENABLED且VALID - 查具体路径是否可写:
!ls -ld /path/to/archive_dest+!df -h /path/to/archive_dest - 避免混用:
log_archive_dest_1和db_recovery_file_dest不要指向同一文件系统不同子目录 —— 容易因 inode 或 quota 限制互相干扰
FRA 空间问题最麻烦的点在于:它同时受数据库参数、OS 文件系统、ASM diskgroup、归档路径配置四层约束。任何一个环节卡住,DELETE OBSOLETE 或 ALTER SYSTEM 都可能看似生效实则无效。


















