ORA-19815 是 Oracle 数据库因 db_recovery_file_dest_size 空间耗尽触发的告警,需通过 alert.log 和 v$recovery_file_dest 视图确认;RMAN 清理失效常因未 CROSSCHECK、保留策略过宽或归档未备份;正确处理顺序为 CROSSCHECK → DELETE EXPIRED → 按时间/策略删除;扩容参数前须确保文件系统真实空间充足;长期方案应配置归档删除策略并定时备份清理。
ORA-19815 不是 RMAN 报的错误,而是 Oracle 数据库在写归档日志或闪回日志时触发的空间告警,RMAN 只是可能参与清理或备份动作。根本问题是 db_recovery_file_dest_size 限制已满,数据库无法继续写入归档、备份片、控制文件快照等文件。
先查告警日志(alert_.log),看到类似这行就坐实了:
ORA-19815: WARNING: db_recovery_file_dest_size of 214748364800 bytes is 100.00% used, and has 0 remaining bytes available.
再连上数据库执行:
SQL> SELECT NAME, SPACE_LIMIT/1024/1024/1024 AS "GB Limit",
SPACE_USED/1024/1024/1024 AS "GB Used",
(SPACE_USED/SPACE_LIMIT)*100 AS "Used%",
SPACE_RECLAIMABLE/1024/1024/1024 AS "GB Reclaimable"
FROM v$recovery_file_dest;
如果 Used% ≥ 95%,且 GB Reclaimable 接近 0,说明可自动清理的空间几乎为零 —— 这才是真瓶颈。
直接跑 DELETE ARCHIVELOG ALL 或 DELETE OBSOLETE 失败或没释放空间?常见原因有:
DELETE 前没做 CROSSCHECK:如果归档日志已被 OS 命令(如 rm)删过,RMAN 不知道,仍认为它“存在”,不会标记为 EXPIRED
SHOW RETENTION POLICY 返回 REDUNDANCY 1 或 RECOVERY WINDOW OF 30 DAYS,但实际归档积压远超窗口,RMAN 认为都“还没过期”BACKED UP 1 TIMES TO DEVICE TYPE DISK),没备份的它不敢动正确顺序应是:
RMAN> CROSSCHECK ARCHIVELOG ALL;
RMAN> DELETE EXPIRED ARCHIVELOG ALL;
RMAN> DELETE ARCHIVELOG UNTIL TIME 'SYSDATE-3';-- 强制删3天前的
RMAN> DELETE OBSOLETE REDUNDANCY 1;-- 配合当前保留策略
看似最简单,但容易踩两个雷:
df -h 看 db_recovery_file_dest 所在目录剩余空间必须 > 新设值,否则下次归档仍失败ALTER SYSTEM SET ... SCOPE=BOTH 生效后,若数据库重启过,该值会从 spfile 加载;但如果之前是 SCOPE=SPFILE,重启前不会生效,而归档失败可能卡在 mount 阶段,导致启动不了稳妥做法:
SQL> ALTER SYSTEM SET db_recovery_file_dest_size = 300G SCOPE=BOTH;
-- 然后立刻验证:
SQL> SHOW PARAMETER db_recovery_file_dest_size;
再检查对应目录磁盘空间是否真实够用,别只信参数值。
临时清空间能救急,但生产环境反复出现 ORA-19815,说明归档节奏和清理节奏没对齐。核心要解决的是“谁来决定删什么、什么时候删”:
CONFIGURE ARCHIVELOG DELETION POLICY TO BACKED UP 1 TIMES TO DISK; —— 明确告诉 RMAN:只要归档被成功备份过一次,就允许删BACKUP ARCHIVELOG ALL DELETE INPUT;,既备份又清理,不留中间态SHUTDOWN IMMEDIATE; STARTUP MOUNT; ALTER DATABASE NOARCHIVELOG; ALTER DATABASE OPEN; —— 但会丢失时间点恢复能力最关键一点:不要依赖 OS 层面手动 rm 归档文件。RMAN 不知情,后续 CROSSCHECK 和 DELETE EXPIRED 就成了必选项,否则空间永远“显示已用但实际空着”。