ora-19815是快速恢复区(fra)空间告警,非崩溃错误但需立即处理,否则归档挂起、事务阻塞;应查v$flash_recovery_area_usage定位瓶颈文件类型,结合crosscheck与delete expired清理失效归档,并校验df -h确保底层磁盘空间充足。
ora-19815 不是数据库崩溃错误,而是快速恢复区(fra)空间告警,必须立即处理,否则归档进程会挂起、新事务可能阻塞。
查清 FRA 实际使用率和瓶颈文件类型
直接查 v$flash_recovery_area_usage 比看 alert 日志更准,它告诉你哪类文件占了大头:
SELECT file_type, percent_space_used, percent_space_reclaimable, number_of_files FROM v$flash_recovery_area_usage;
常见现象:
-
ARCHIVELOG占用高 → 归档日志没及时备份或删除 -
FLASHBACKLOG占用高 → 闪回保留时间太长或业务写入频繁 -
BACKUPPIECE占用高 → RMAN 备份集长期未清理,尤其跨平台迁移后残留
注意:v$recovery_file_dest 的 SPACE_USED 是 Oracle 自己统计的,和 du -sh 结果可能不一致——后者含 OS 层残留文件,前者只认控制文件里注册过的文件。
RMAN 清理 expired 归档日志前必须 crosscheck
如果你用 rm 手动删过归档文件,控制文件里还留着记录,RMAN 不会自动同步。此时直接 delete expired archivelog all 无效,必须先做校验:
rman target /-
crosscheck archivelog all→ 把控制文件中已不存在的归档标记为EXPIRED -
delete noprompt expired archivelog all→ 真正清除控制文件中的元数据
漏掉 crosscheck 是最常踩的坑:命令执行成功但空间不释放,因为 Oracle 还“以为”那些文件存在。
调整 db_recovery_file_dest_size 只是临时缓解
增大参数能快速解燃眉之急,但治标不治本:
-
alter system set db_recovery_file_dest_size = 40G scope=both;(注意单位是字节,40G合法,40GB报错) - 该参数只限制 Oracle 在 FRA 内能写的上限,不解决底层磁盘是否真有空间的问题
- 如果
db_recovery_file_dest目录所在文件系统本身只剩几 GB,调再大也没用
真正要检查的是:df -h 看挂载点剩余空间,不是只看 Oracle 视图里的 SPACE_RECLAIMABLE。
避免反复触发 ORA-19815 的关键动作
长期稳定运行得靠策略落地,不是每次手动删:
- 设置 RMAN 保留策略:
configure retention policy to recovery window of 7 days;(比默认的redundancy 1更可控) - 启用自动清理归档:
configure archivelog deletion policy to applied on standby;(有 Data Guard 时) - 定期执行
backup recovery area→ 注意:该命令必须配 tape 通道,disk 通道会报RMAN-06747 - 禁用 Flashback Database?谨慎。若业务不需要闪回,可
alter database flashback off;,立刻释放FLASHBACKLOG占用
最易被忽略的一点:crosscheck 和 delete expired 必须成对执行,且不能跳过;哪怕只是临时腾空间,也要走完这个闭环,否则下次还会卡在同一个地方。











