DELETE EXPIRED BACKUP 不删除任何备份是因为未先执行 CROSSCHECK BACKUP,该命令负责标记磁盘上不存在的备份为 EXPIRED,之后 DELETE EXPIRED BACKUP 才能清理这些已标记记录。

为什么 DELETE EXPIRED BACKUP 没删掉任何东西
执行 DELETE EXPIRED BACKUP 后显示 “0 objects deleted”,不是命令写错了,而是 RMAN 只清理那些**已被标记为 EXPIRED 的记录**——而这些标记往往根本没生成。常见原因包括:备份文件物理存在但控制文件里已丢失该条目;或你只执行了 DELETE EXPIRED BACKUP,却忘了先做 CROSSCHECK BACKUP。RMAN 不会主动扫描磁盘发现“缺失”,必须靠 CROSSCHECK 主动触发状态刷新。
必须先 CROSSCHECK,再 DELETE EXPIRED
CROSSCHECK BACKUP 是元数据同步的强制步骤,它让 RMAN 逐个检查控制文件中记录的每个备份片(.bkp)是否真实存在于磁盘路径上。找不到的,就统一标为 EXPIRED;找得到的,状态更新为 AVAILABLE。这一步不可跳过、不可省略、不可用其他命令替代。
- 在主库执行:始终只在主库操作,备库禁止运行任何
DELETE类命令 - 若用恢复目录:连接时必须带
catalog,且之后补RESYNC CATALOG - 权限问题:确保 Oracle OS 用户对备份路径有读权限,否则
CROSSCHECK会静默跳过部分文件
DELETE EXPIRED BACKUP 的实际效果边界
它只删备份集(backupset)和镜像副本(copy)的主记录,不自动级联清理依赖项。比如:
-
RC_BACKUP_PIECE中残留的碎片条目可能还在 - 归档日志的关联记录不会被顺带清除,得单独跑
DELETE EXPIRED ARCHIVELOG ALL - 即使返回成功,
LIST BACKUP SUMMARY仍可能显示 STATUS = DELETED 的旧条目——这是正常行为,非 bug
真正顽固的是归档日志元数据:哪怕磁盘上归档全空了,控制文件里还留着几十条 ARCHIVED LOG 记录,此时必须配 CHANGE ARCHIVELOG ALL CROSSCHECK DELETE EXPIRED BACKUP 才能清干净。
删完还是看见旧备份?检查这三个地方
执行完 CROSSCHECK BACKUP 和 DELETE EXPIRED BACKUP 后,如果 LIST BACKUP 还显示大量条目,别急着重试,先确认:
- 是否用了恢复目录但没连上?
SHOW ALL看当前连接上下文 - 备份路径是否变更过?比如从
/u01/backup挪到+FRA,旧路径下的文件CROSSCHECK扫不到 -
V$CONTROLFILE_RECORD_SECTION中ARCHIVED LOG和BACKUP PIECE的RECORDS_TOTAL是否接近RECORDS_USED?如果是,说明控制文件空间快满,老记录被覆盖,RMAN 已“失忆”——这时只能靠find+rm手工清理 OS 层文件,再补CROSSCHECK
最易被忽略的是 control_file_record_keep_time 设置:默认 7200 秒(2 小时),归档日志元数据超过这个时间就会被覆盖。生产环境建议调大到 259200(3 天)以上,否则 RMAN 根本记不住你刚删过什么。











