ora-19815错误本质是控制文件元数据未同步,需用rman执行crosscheck archivelog all和delete expired更新状态,否则v$flash_recovery_area_usage统计不释放空间。

ORA-19815不是磁盘满,是控制文件元数据没同步
ORA-19815报错时,df -h可能显示磁盘还有大量剩余空间,但Oracle仍报“100% used”。这是因为Oracle只认控制文件里注册过的文件——你在OS层用rm删了归档日志,物理文件没了,但控制文件还记着它们存在,v$flash_recovery_area_usage统计值就不会变。数据库启动、归档、甚至alter system switch logfile都会触发检查,于是持续告警甚至挂起。
常见误操作:直接rm -rf $ORACLE_BASE/fast_recovery_area/*后以为万事大吉,结果startup mount失败或archive log list报错。
- 查真实占用分布:
SELECT file_type, percent_space_used, percent_space_reclaimable, number_of_files FROM v$flash_recovery_area_usage; - 别信
v$recovery_file_dest.SPACE_USED,它和du -sh结果常不一致——前者只统计注册文件,后者含OS残留 - 真正瓶颈可能是
BACKUPPIECE(RMAN备份集残留)或FLASHBACKLOG(闪回日志堆积),不一定是ARCHIVELOG
RMAN清理必须先crosscheck再delete expired
漏掉crosscheck是90%以上手动清理失败的根源。RMAN不会自动感知OS层文件变更,必须强制它扫描物理路径并更新控制文件状态。
执行顺序不能颠倒:
- 连接RMAN:
rman target / - 校验所有归档日志物理存在性:
CROSSCHECK ARCHIVELOG ALL;(这步会把已丢失的标记为EXPIRED) - 清除失效元数据:
DELETE NOPROMPT EXPIRED ARCHIVELOG ALL;(只删控制文件记录,不碰磁盘) - 如需进一步释放空间,再跑:
DELETE NOPROMPT OBSOLETE;(依赖当前RMAN保留策略)
执行后立刻查v$flash_recovery_area_usage,percent_space_reclaimable应明显上升。若没变化,说明crosscheck没成功——检查RMAN是否连的是正确实例,归档路径是否被log_archive_dest_1覆盖。
db_recovery_file_dest_size调大只是临时止血
ALTER SYSTEM SET db_recovery_file_dest_size = 100G SCOPE=BOTH;能快速让数据库继续归档,但它不解决根本问题:如果归档生成速度 > 清理速度,几小时后又满。
更关键的是,这个参数只是Oracle内部逻辑上限,和底层磁盘无关:
- 单位是字节,
40G合法,40GB会报错 - 即使设成
200G,若df -h显示挂载点只剩5G,照样爆 - 紧急时可配合RMAN清理一起用,但长期必须落地策略
真正要盯的是df -h输出的挂载点可用空间,不是Oracle视图里的SPACE_RECLAIMABLE。
长期稳定得靠RMAN策略+归档路径分离
每次手动清理都是救火,治本要靠配置固化:
- 设置合理保留窗口:
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;(比默认REDUNDANCY 1更可控) - 有Data Guard时启用自动清理:
CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON STANDBY; - 彻底避开FRA争抢:把归档挪出
DB_RECOVERY_FILE_DEST,例如:ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=/u01/arch' SCOPE=BOTH;,再ALTER SYSTEM SET DB_RECOVERY_FILE_DEST='' SCOPE=BOTH;
备库遇到ORA-19815要格外小心——大概率是MRP进程卡住没应用归档,不是空间真不够。先查v$archived_log里applied列,别急着删。











