根本原因是RMAN只删除“已被备份且标记为可删除”的归档日志,而“可删除”状态依赖控制文件或恢复目录中完整、未过期的备份元数据;若备份失败、中断或元数据超期被覆盖,RMAN便跳过清理。
为什么 DELETE INPUT 有时没删掉归档日志
根本原因不是命令写错了,而是 rman 默认只清理「已被备份且标记为可删除」的日志——而这个“可删除”状态依赖于控制文件或恢复目录里记录的备份元数据是否完整、是否过期。如果之前备份失败、中断,或者用了 nokeep 但没配 archivelog deletion policy,rman 就不敢动。
- 检查当前归档状态:
LIST ARCHIVELOG ALL;看哪些是AVAILABLE但没被标记DELETED - 确认最近一次备份是否成功完成:
LIST BACKUP OF ARCHIVELOG ALL;,重点看STATUS = AVAILABLE且COMPLETION TIME在你期望的时间范围内 - 若用的是控制文件模式(没开恢复目录),控制文件保留策略默认只有 7 天;超时后元数据被覆盖,
DELETE INPUT就会跳过那些“记不清有没有备过”的日志
BACKUP ARCHIVELOG ALL DELETE INPUT 的真实执行顺序
这不是“先备再删”的原子操作,而是分三步走:RMAN 先扫描所有 ARCHIVELOG,挑出符合当前备份策略的(比如未被备份过的、或超过保留策略的),然后逐个备份,每备完一个就立刻发一条 CHANGE ARCHIVELOG ... UNCATALOG + DELETE 请求。中间任意一步失败,后续就停,已备份的不会回滚,但没轮到的日志也不会被删。
- 加
NOT BACKED UP 1 TIMES更安全:BACKUP ARCHIVELOG NOT BACKED UP 1 TIMES DELETE INPUT;,避免重复备份旧日志导致误删 - 加
FORMAT显式指定路径,防止因闪回区满或权限问题导致备份卡在某一个日志上,进而阻塞后续删除:FORMAT '/u01/backup/al_%d_%T_%s_%p' - 别在归档路径和 FRA(快速恢复区)混用;如果归档直接写进 FRA,
DELETE INPUT可能被 FRA 自动清理策略干扰,行为不可控
替代方案:用 DELETE ARCHIVELOG 手动清理更可控
当你要清掉明确时间段或序列号范围的日志,或者 RMAN 自动逻辑总出问题时,绕过备份直接删反而更稳——前提是确定这些日志确实不需要了,且有其他备份手段兜底(比如 NAS 同步、异地拷贝)。
- 删指定时间前的:
DELETE ARCHIVELOG UNTIL TIME 'SYSDATE-3'; - 删指定序列号段:
DELETE ARCHIVELOG FROM SEQUENCE 123456 UNTIL SEQUENCE 123500; - 强制删(跳过 RMAN 元数据检查):
DELETE FORCE ARCHIVELOG ALL;,慎用,仅限控制文件损坏或恢复目录丢失后应急 - 删完务必运行:
CROSSCHECK ARCHIVELOG ALL;,否则下次LIST还会显示那些物理已不存在但控制文件里还挂着的“幽灵日志”
容易被忽略的权限与归档路径陷阱
RMAN 进程必须对归档日志所在目录有读+执行(rx)权限,否则连扫描都失败,报错像 RMAN-03009: failure of backup command on ORA_DISK_1 channel,但实际根本没开始备份,更不会删。
- 检查归档路径是否含符号链接:
ARCHIVE_LAG_TARGET或LOG_ARCHIVE_DEST_1指向的是软链?RMAN 不解析软链,会认为路径不可达 - 如果归档写到 ASM,确保 RMAN 连接的是具有
SYSASM权限的用户,普通SYSDBA在某些版本下无法访问 ASM 归档目录 - Linux 下注意 SELinux 上下文,
ls -Z看归档目录是否被标为oracle_db_t;不是的话,chcon -t oracle_db_t /path/to/arch,否则系统级拒绝访问

















