必须先执行CROSSCHECK刷新备份状态,再用DELETE NOPROMPT EXPIRED BACKUPSET清除“幽灵备份”元数据;归档日志需单独CROSSCHECK ARCHIVELOG ALL后删除;DELETE OBSOLETE按保留策略删有效但过期的备份,二者不可替代。

直接删不掉的“幽灵备份”,不是RMAN没执行,而是控制文件里还记着那些早已被rm -f干掉的物理文件——这些记录状态是EXPIRED或AVAILABLE但文件已不存在,必须先用CROSSCHECK刷新状态,再DELETE EXPIRED清除元数据。
为什么LIST BACKUP还显示几百个备份,df却显示空间已释放?
RMAN资料库(control file / recovery catalog)里存的是备份元数据,不是文件本身。如果你或同事曾手动rm -f删过.bkp文件,RMAN并不知道——它仍认为那些备份“存在”,状态保持为AVAILABLE(甚至误判为EXPIRED)。此时LIST BACKUP会列出大量条目,但DELETE BACKUPSET BEFORE TIME完全跳过它们,因RMAN只删“能找到”的文件。
-
CROSSCHECK BACKUP会逐个扫描磁盘上是否真有对应.bkp文件,把找不到的标记为EXPIRED -
DELETE NOPROMPT EXPIRED BACKUPSET才真正清掉这些“失效记录” - 漏掉
CROSSCHECK这步,DELETE EXPIRED什么都不会删
DELETE EXPIRED BACKUPSET和DELETE OBSOLETE的区别
DELETE EXPIRED BACKUPSET清的是“物理文件已丢、元数据还挂着”的记录;DELETE OBSOLETE删的是“文件还在、但按保留策略已不需要”的备份。两者目标完全不同,不能互相替代。
-
DELETE OBSOLETE依赖CONFIGURE RETENTION POLICY配置,比如设了RECOVERY WINDOW OF 14 DAYS,它就删14天前所有能被覆盖的备份 -
DELETE EXPIRED BACKUPSET不看策略,只看CROSSCHECK后标记为EXPIRED的条目 - 生产环境建议组合使用:
CROSSCHECK BACKUP→DELETE NOPROMPT EXPIRED BACKUPSET→DELETE NOPROMPT OBSOLETE
脚本中必须加NOPROMPT,且不能省略引号和分号
RMAN在非交互模式下执行脚本时,DELETE类命令默认会停住等你输入YES,导致自动化任务卡死。同时,时间字符串若不加单引号,或SQL表达式嵌套引号出错,会直接报ORA-19554。
- 正确写法:
DELETE NOPROMPT EXPIRED BACKUPSET;(注意结尾分号) - 错误写法:
DELETE EXPIRED BACKUPSET(缺NOPROMPT,脚本挂起) - 错误写法:
DELETE NOPROMPT EXPIRED BACKUPSET BEFORE TIME SYSDATE-7(缺引号,语法错) - 时间条件仅对
BACKUPSET生效,EXPIRED不支持BEFORE TIME子句
归档日志的EXPIRED记录要单独处理
CROSSCHECK BACKUP只扫备份集(.bkp),不扫归档日志(.dbf)。如果归档目录里也有人工删过文件,必须额外跑CROSSCHECK ARCHIVELOG ALL,再DELETE NOPROMPT EXPIRED ARCHIVELOG ALL。
- 顺序不能反:先
CROSSCHECK ARCHIVELOG ALL,再DELETE EXPIRED ARCHIVELOG ALL -
DELETE EXPIRED ARCHIVELOG ALL只清元数据,不碰磁盘文件;真正的物理清理靠DELETE ARCHIVELOG ... DELETE INPUT或find -mtime +7 -delete - 备库上还要确认
v$archive_gap为空、MRP进程正常,否则DELETE INPUT可能破坏恢复链
最易被忽略的一点:CROSSCHECK不是“查一遍就完事”,它实际会触发一次全量磁盘扫描——如果备份文件分散在多个NFS路径或慢速存储上,这个操作可能耗时数分钟。别在业务高峰期跑,也别把它当成“快速补救”而跳过验证步骤。


















