一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

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_.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,说明可自动清理的空间几乎为零 —— 这才是真瓶颈。


RMAN DELETE 命令为什么有时不生效

直接跑 DELETE ARCHIVELOG ALLDELETE OBSOLETE 失败或没释放空间?常见原因有:

  1. DELETE 前没做 CROSSCHECK:如果归档日志已被 OS 命令(如 rm)删过,RMAN 不知道,仍认为它“存在”,不会标记为 EXPIRED
  2. 保留策略太宽松:SHOW RETENTION POLICY 返回 REDUNDANCY 1RECOVERY WINDOW OF 30 DAYS,但实际归档积压远超窗口,RMAN 认为都“还没过期”
  3. 有未备份的归档日志: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 的坑

看似最简单,但容易踩两个雷:

  1. 参数改大了,但底层文件系统实际没空间 —— df -hdb_recovery_file_dest 所在目录剩余空间必须 > 新设值,否则下次归档仍失败
  2. 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,说明归档节奏和清理节奏没对齐。核心要解决的是“谁来决定删什么、什么时候删”:

  1. CONFIGURE ARCHIVELOG DELETION POLICY TO BACKED UP 1 TIMES TO DISK; —— 明确告诉 RMAN:只要归档被成功备份过一次,就允许删
  2. 配合定时任务跑 BACKUP ARCHIVELOG ALL DELETE INPUT;,既备份又清理,不留中间态
  3. 禁用归档(仅限开发/测试库):SHUTDOWN IMMEDIATE; STARTUP MOUNT; ALTER DATABASE NOARCHIVELOG; ALTER DATABASE OPEN; —— 但会丢失时间点恢复能力

最关键一点:不要依赖 OS 层面手动 rm 归档文件。RMAN 不知情,后续 CROSSCHECKDELETE EXPIRED 就成了必选项,否则空间永远“显示已用但实际空着”。

热门栏目