ora-19815是严重告警,非错误,但会导致归档失败、实例挂起或无法启动;须立即查v$flash_recovery_area_usage中percent_space_reclaimable值,若接近0则需rman crosscheck+delete expired清理元数据,再删可回收归档,增大db_recovery_file_dest_size仅为临时缓解且需配合手动切日志生效。

ORA-19815 不是错误,而是严重告警,但会直接导致归档失败、实例挂起甚至无法启动——必须立刻处理。
查清闪回区真实使用率和可回收空间
不能只看 db_recovery_file_dest_size 和告警里“100% used”,实际可清理空间可能被 RMAN 认为“不可回收”。关键要看 v$flash_recovery_area_usage 里的 percent_space_reclaimable 字段:
- 如果
reclaimable接近 0,说明归档日志没被备份或没过期,RMAN 不敢删 - 如果
used高但reclaimable也高(比如 >30%),说明只是策略没生效,不是真没空间 - 执行:
SELECT file_type, percent_space_used, percent_space_reclaimable, number_of_files FROM v$flash_recovery_area_usage;
RMAN DELETE 命令必须配合 CROSSCHECK 才有效
很多人在 OS 层用 rm 直接删了归档日志,结果 RMAN 还以为文件存在,DELETE ARCHIVELOG ALL 不起作用。这时必须先同步元数据:
- 进入 RMAN:
rman target / - 强制刷新状态:
CROSSCHECK ARCHIVELOG ALL;(标记已丢失的归档为EXPIRED) - 清理无效记录:
DELETE EXPIRED ARCHIVELOG ALL; - 再删真正可删的:
DELETE ARCHIVELOG UNTIL TIME 'SYSDATE-7';(按时间删,比ALL更安全)
增大 db_recovery_file_dest_size 是临时解法,但有坑
调大参数能快速缓解,但不解决根本问题,且容易掩盖备份策略缺陷:
- 修改后必须重启实例或至少
ALTER SYSTEM ARCHIVE LOG CURRENT;触发一次归档,否则新空间不生效 - 值不能超过底层文件系统剩余空间,否则下次归档仍失败(
ORA-19804会紧跟出现) - 生产库慎用:比如从 2G 改到 10G,若没配好 RMAN retention,等于把问题延迟爆发
- 命令示例:
ALTER SYSTEM SET db_recovery_file_dest_size = 10G SCOPE=BOTH;
归档阻塞时连 startup mount 都可能失败
当闪回区满到触发 ORA-19809 + ORA-16038 组合时,数据库可能卡在 MOUNT 阶段,连 ALTER DATABASE OPEN 都执行不了。此时唯一可靠路径是:
- 用
startup nomount启动实例 - 再
alter database mount(这步通常能成功) - 立刻进 RMAN 执行
CROSSCHECK+DELETE EXPIRED,释放空间 - 最后
alter database open,否则 ARC 进程一启动就再次报错
最易被忽略的是:哪怕你刚删完归档,只要没手动切一次日志(ALTER SYSTEM ARCHIVE LOG CURRENT;),ARC 进程仍可能卡住不动——它不会自动重试失败的归档任务。











