rman冗余策略(redundancy)仅标记多余备份为obsolete,不自动删除;必须手动执行delete obsolete,且需先运行crosscheck同步元数据,否则物理文件不会被清理。

RMAN配置的冗余策略(REDUNDANCY)不会自动清理旧备份,它只定义“哪些备份可被标记为OBSOLETE”,真正删除必须手动触发DELETE OBSOLETE,且依赖CROSSCHECK同步元数据。
为什么CONFIGURE RETENTION POLICY TO REDUNDANCY 2设了却没删文件
冗余策略本身不执行任何删除动作,它只是在DELETE OBSOLETE运行时提供判定依据。常见误解是“配完就自动删”,但实际流程是:
- RMAN先查控制文件里每个数据文件有多少份有效备份
- 若超过设定份数(如2份),多余备份被标记为OBSOLETE
- 但标记≠删除,必须显式执行DELETE NOPROMPT OBSOLETE才落地
- 脚本里漏掉
DELETE OBSOLETE这一步,磁盘空间永远不释放 - 即使配了
REDUNDANCY 2,若从未跑过BACKUP DATABASE,控制文件里没记录足够备份,REPORT OBSOLETE也会显示“no obsolete backups” -
SHOW RETENTION POLICY输出必须确认是REDUNDANCY 2,而不是被之前CONFIGURE RETENTION POLICY CLEAR退回到TO NONE
CROSSCHECK缺失导致DELETE OBSOLETE静默跳过物理文件
RMAN判断备份是否“存在”,靠的是控制文件中RC_BACKUP_PIECE和V$BACKUP_PIECE的状态字段。如果备份片被手工rm或NFS挂载异常,RMAN仍认为它“在线”,DELETE OBSOLETE不会碰它——既不删,也不报错。
- 必须在
DELETE OBSOLETE前加CROSSCHECK BACKUP,强制刷新状态 -
CROSSCHECK失败时会把对应备份片标为EXPIRED,这时需先DELETE NOPROMPT EXPIRED BACKUP清空无效记录 - 控制文件保留元数据的时长受
CONTROL_FILE_RECORD_KEEP_TIME限制(默认7天),超期备份无法被CROSSCHECK识别,只能用find /backup/path -name "*.bkp" -mtime +30 -delete这类OS命令处理
归档日志不完整会让REDUNDANCY策略误判
REDUNDANCY只数备份份数,不验证恢复链完整性。但如果归档日志被提前清理、或LOG_ARCHIVE_DEST_n路径未被RMAN识别,RMAN可能错误地认为某份全备“不可用于恢复”,进而把它标为OBSOLETE并删掉——结果是备份变少,但恢复能力反而下降。
- 执行
LIST BACKUP OF DATABASE后,再对每份备份运行LIST BACKUP OF ARCHIVELOG FROM TIME 'SYSDATE-7',确认归档链覆盖范围 - 确保
LOG_ARCHIVE_DEST_1含VALID_FOR=(ALL_LOGFILES,ALL_ROLES),否则RMAN可能忽略本地归档路径 - 若用FRA(
db_recovery_file_dest),检查show parameter db_recovery_file_dest_size是否被撑满,ORA-19809会阻塞所有备份操作
真正起作用的从来不是“配了什么”,而是“谁在什么时候调用了什么命令、是否同步了元数据、物理文件是否真能被访问”。REDUNDANCY策略生效链条里,CROSSCHECK和DELETE OBSOLETE缺一不可,而这两步都必须出现在你的自动化脚本里,不能只靠配置寄希望于RMAN自己动。











