最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Oracle数据库RMAN报ORA-19815如何解决
时间:2026-08-25 09:43:48 编辑:袖梨 来源:一聚教程网
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_),看到类似这行就坐实了:
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,说明可自动清理的空间几乎为零 —— 这才是真瓶颈。
RMAN DELETE 命令为什么有时不生效
直接跑 DELETE ARCHIVELOG ALL 或 DELETE OBSOLETE 失败或没释放空间?常见原因有:
-
DELETE前没做CROSSCHECK:如果归档日志已被 OS 命令(如rm)删过,RMAN 不知道,仍认为它“存在”,不会标记为EXPIRED - 保留策略太宽松:
SHOW RETENTION POLICY返回REDUNDANCY 1或RECOVERY WINDOW OF 30 DAYS,但实际归档积压远超窗口,RMAN 认为都“还没过期” - 有未备份的归档日志: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;-- 配合当前保留策略
增大 db_recovery_file_dest_size 的坑
看似最简单,但容易踩两个雷:
- 参数改大了,但底层文件系统实际没空间 ——
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 就成了必选项,否则空间永远“显示已用但实际空着”。