rman不自动清理过期归档的根本原因是retention policy失效(如to none)、archivelog deletion policy未配置本地路径、crosscheck缺失导致元数据脱节,或control_file_record_keep_time过短致老归档不可见。
rman 不自动清理过期归档,根本原因不是策略没配,而是策略配了但被其他配置或状态覆盖、屏蔽或失效了。 你执行 delete obsolete 没反应,report obsolete 显示“no obsolete backups”,不代表归档真的安全——很可能它压根没进 rman 的判定范围。
RETENTION POLICY 配置被隐式清空或未生效
19c 升级后常见现象:旧库的 RETENTION POLICY 不会自动继承,且一旦执行过 CONFIGURE RETENTION POLICY CLEAR(哪怕只是测试),策略就退回到默认的 TO NONE —— 这意味着 RMAN 永远不会标记任何备份或归档为 OBSOLETE。
- 检查真实策略:
SHOW RETENTION POLICY;,别信记忆或脚本注释 - 若输出是
RETENTION POLICY TO NONE,立刻重配,例如:CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS; -
TO NONE在使用 FRA(db_recovery_file_dest)时极其危险:RMAN 不删,FRA 空间满则触发ORA-19809,数据库可能 hang 住
ARCHIVELOG DELETION POLICY 未绑定到本地归档路径
19c 默认只信任 LOG_ARCHIVE_DEST_n 中标记为 SYNC 或 STANDBY 的目的地。如果你只用 LOCATION=/arch 这类本地路径,RMAN 的 DELETE OBSOLETE 和 DELETE ARCHIVELOG ALL COMPLETED BEFORE 可能静默跳过这些文件,甚至报 RMAN-08137: archived log not deleted, no valid checkpoint found。
- 确认当前归档目标类型:
SELECT DEST_NAME, TARGET, BINDING FROM V$ARCHIVE_DEST WHERE STATUS = 'VALID'; - 若
BINDING = 'MANDATORY'且TARGET = 'PRIMARY',必须显式启用删除策略:CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON STANDBY;(即使没备库,也得这么配) - 更稳妥的做法是改用
LOG_ARCHIVE_DEST_1='LOCATION=/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES)',再配策略
CROSSCHECK 缺失导致元数据与物理文件脱节
RMAN 判定归档是否可删,依赖控制文件里 v$archived_log 的 DELETED 和 STATUS 字段。如果归档目录被手动 rm 过,或 NFS 挂载异常导致文件临时不可见,RMAN 仍认为它们存在,REPORT OBSOLETE 就不会列出它们,DELETE OBSOLETE 更不会碰。
- 必须先执行:
CROSSCHECK ARCHIVELOG ALL;—— 这步强制刷新控制文件记录,把缺失文件标为EXPIRED - 再跑:
DELETE NOPROMPT EXPIRED ARCHIVELOG ALL;清除元数据残留 - 最后才是:
DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7'; - 漏掉
CROSSCHECK是定时脚本长期运行后“空间不释放”的最常见原因
控制文件记录过期时间太短,老归档根本不在 RMAN 视野里
Oracle 控制文件默认只保留约 30 天的归档元数据(由 control_file_record_keep_time 参数控制)。超过这个时间的归档,哪怕物理文件还在磁盘上,RMAN 也完全“看不见”——REPORT OBSOLETE 不会列,DELETE OBSOLETE 不会删,CROSSCHECK 也扫不到。
- 查当前值:
SHOW PARAMETER control_file_record_keep_time; - 若值是 7 或 14,立刻调大:
ALTER SYSTEM SET control_file_record_keep_time=30 SCOPE=BOTH; - 注意:该参数只影响新生成的归档记录,已丢失的老归档仍需手工清理(
ls -lt /arch | head -20+rm) - 这种“RMAN 管不到”的文件,删前务必确认无异地恢复、无合规审计留存要求
真正麻烦的从来不是命令怎么写,而是你以为策略在起作用,其实它早就被某次 CLEAR、某个没配的 DELETION POLICY 或一次没做的 CROSSCHECK 给悄悄绕过去了。每次清理前,先 SHOW ALL,再 LIST ARCHIVELOG SUMMARY,最后看 v$recovery_file_dest 的 SPACE_USED 是否真下降——别只信 df -h。











