RMAN全备不自动删归档的根本原因是其本身不承担自动清理职责,归档生命周期由独立配置的ARCHIVELOG DELETION POLICY控制,默认TO NONE即永不删除;DELETE INPUT仅作用于本次备份选中的归档,且必须配合CROSSCHECK同步元数据、启用隐含参数"_log_deletion_policy"=ALL并重启才真正生效。

RMAN全备(BACKUP DATABASE PLUS ARCHIVELOG)不自动删除过期归档日志,根本原因不是命令写得不对,而是它压根没这个职责——RMAN从不“自动清理”,只响应明确指令,且归档日志的生命周期由独立策略控制,与备份命令本身无关。
BACKUP ... DELETE INPUT 只删本次选中的归档
很多人误以为加了 DELETE INPUT 就等于“清空旧归档”。其实它只作用于本次 BACKUP ARCHIVELOG 命令实际读取并备份的那一部分归档文件,不会触碰更早、未被本次命令覆盖的归档。
-
BACKUP ARCHIVELOG ALL DELETE INPUT:只删本次备份过程中扫描到的、且已成功备份的归档;若某些归档因路径不在LOG_ARCHIVE_DEST_n范围内、或状态为EXPIRED,它根本不会处理 - 如果归档目录里有大量未被本次命令“看到”的文件(比如手动挪过位置、或元数据已过期),
DELETE INPUT对它们完全无感 - 哪怕你每天跑一次全备+delete input,只要中间某天漏了归档备份(如磁带库离线),那些漏掉的归档就会持续堆积
ARCHIVELOG DELETION POLICY 才是真正的开关
归档能不能删,只取决于 CONFIGURE ARCHIVELOG DELETION POLICY,而不是 RETENTION POLICY 或备份命令本身。默认值是 TO NONE,即“永不许删”。
-
SHOW ARCHIVELOG DELETION POLICY输出TO NONE?那所有 delete 操作都会静默跳过归档,连报错都懒得给 - 配成
TO BACKED UP 1 TIMES TO DISK后,RMAN 才会在确认归档已被备份到本地磁盘后,允许后续DELETE INPUT或DELETE ARCHIVELOG删除它 - 在 Data Guard 环境下配
TO APPLIED ON STANDBY,但备库 MRP 进程没运行,V$ARCHIVED_LOG.APPLIED仍是'NO',删归档就卡住,报RMAN-08137 - 该策略还依赖隐含参数生效:
ALTER SYSTEM SET "_log_deletion_policy" = ALL SCOPE=SPFILE;,否则配了也白配,且不报错
CROSSCHECK 缺失导致 RMAN “看不见”物理存在的归档
即使策略配对、权限正常,RMAN 仍可能对磁盘上真实存在的归档视而不见——因为控制文件里的元数据早已脱节。
-
LIST ARCHIVELOG ALL查不到文件?说明v$archived_log里没记录,DELETE ARCHIVELOG必然无效 - 常见诱因:
control_file_record_keep_time默认约 30 天,超时后老归档元数据被覆盖;或归档被手动mv/rm过,但没做CROSSCHECK - 必须先跑:
CROSSCHECK ARCHIVELOG ALL→ 把物理存在但标记为MISSING的条目标为EXPIRED;再跟DELETE NOPROMPT EXPIRED ARCHIVELOG ALL,才能释放 FRA 配额 - 跳过这步直接删,会出现“df -h 空间不释放”“FRA 使用率 99% 却 report obsolete 显示 no obsolete backups”的假满现象
真正可靠的清理不是靠一次全备命令,而是三件事缺一不可:策略配对、元数据同步、外部调度执行闭环脚本。最容易被忽略的是 _log_deletion_policy 隐含参数和 CROSSCHECK 的强制刷新动作——没它们,其余配置全是纸面逻辑。


















