rman删除归档日志无效的主因是“看不见”文件,核心在于未执行crosscheck、归档路径不在rman感知范围、控制文件元数据过期或权限不足;必须按crosscheck→delete expired→delete completed before顺序操作,并在备库确认applied=yes后执行。

为什么DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7'经常没效果
不是命令写错了,是 RMAN 根本“看不见”那些文件。常见原因有四个:
• CROSSCHECK ARCHIVELOG ALL 没先执行:控制文件里记录的归档状态已过期,物理文件还在磁盘上,但 RMAN 不会主动扫描;
• 归档路径不在 DB_RECOVERY_FILE_DEST 或 RMAN 已知范围内:比如手动挪到 /backup/arch,LIST ARCHIVELOG ALL 查不到,自然删不了;
• control_file_record_keep_time(默认约 30 天)已超:元数据被覆盖,RMAN 完全无法识别这些归档,只能 OS 层面 find + rm;
• RMAN 进程对归档目录无写权限:删操作静默失败,错误只记在日志里,df -h 看不出空间释放。
CROSSCHECK、DELETE EXPIRED、DELETE COMPLETED BEFORE 三步缺一不可
顺序乱了或少一步,就会出现“文件删了但 FRA 空间不释放”或“V$RECOVERY_FILE_DEST 显示 99% 使用率”的假满现象:
• CROSSCHECK ARCHIVELOG ALL:强制扫描磁盘上所有归档文件,把物理缺失的标记为 EXPIRED;
• DELETE NOPROMPT EXPIRED ARCHIVELOG ALL:清除控制文件中失效记录,这步才是真正释放 FRA 配额的关键;
• DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7':按业务窗口删有效归档——注意,COMPLETED BEFORE 查的是 v$archived_log.completion_time,不是文件修改时间。
备库执行前必须确认 APPLIED = 'YES'
主库删归档是常规操作,但备库上删之前得查清楚:
• 执行 SELECT sequence#, applied FROM v$archived_log WHERE applied = 'NO' AND completion_time > SYSDATE - 7;,如果结果非空,说明最近 7 天内有归档还没应用;
• 直接删会导致同步断裂,ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; 后再查更稳妥;
• 如果用了 DG Broker,还要确认 SELECT database_name, protection_mode, guard_status FROM v$database; 中 guard_status 不是 STANDBY,否则部分删除命令会被拦截。
脚本里别漏掉 DELETE OBSOLETE 和权限校验
光清归档不够,废弃备份也会占大量空间:
• DELETE NOPROMPT OBSOLETE 必须加在脚本末尾,它根据当前 RETENTION POLICY(如 CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 14 DAYS)清理所有过期备份集;
• 脚本开头要检查 ORACLE_HOME、ORACLE_SID、PATH 是否生效,尤其 rman 二进制路径是否在 $ORACLE_HOME/bin 下;
• Linux 下建议用 id -u 和 ls -ld $ORACLE_HOME/dbs 验证 oracle 用户对关键目录是否有读写权,否则 CROSSCHECK 可能部分跳过。
实际清理永远卡在“RMAN 看不见”和“备库不敢动”这两点上,不是命令不会写,是状态没摸清就动手。











