RMAN的DELETE EXPIRED BACKUP仅清理已标记为EXPIRED的记录,必须先执行CROSSCHECK BACKUP扫描磁盘并更新状态,否则因无EXPIRED条目而返回“0 objects deleted”;归档日志元数据更顽固,需配对CROSSCHECK ARCHIVELOG ALL与DELETE NOPROMPT EXPIRED ARCHIVELOG ALL,并注意Data Guard环境下的DB_UNIQUE_NAME限定及恢复目录同步。
DELETE EXPIRED BACKUP 不会删掉任何东西,除非你先做 CROSSCHECK BACKUP。RMAN 只清理控制文件里已标记为 EXPIRED 的记录,而这些标记不会自动产生——物理文件丢了,控制文件却还“以为它在”。
为什么 DELETE EXPIRED BACKUP 没效果?
执行后返回 0 objects deleted 是常态,不是命令写错了。根本原因是:crosscheck backup 没跑过,或者没跑全。
- RMAN 不主动扫描磁盘;它只信控制文件里的状态
- 手动
rm了备份文件,但没进 RMAN 做CROSSCHECK→ 控制文件仍记着“存在”,状态是AVAILABLE或UNAVAILABLE,不是EXPIRED -
CROSSCHECK遇到权限不足、路径不存在、NFS挂载异常时会跳过某些文件,导致部分条目漏标EXPIRED - 用了恢复目录(recovery catalog)但没
RESYNC CATALOG→ 主库控制文件和目录状态不一致,EXPIRED判定失效
归档日志元数据比备份更难清干净
归档日志的残留记录特别顽固:哪怕你用 DELETE ARCHIVELOG ALL 清空了物理文件,v$archived_log 和控制文件里仍可能显示“DELETED”或“EXPIRED”状态,FRA 使用率也不下降。
- 必须配对执行:
CROSSCHECK ARCHIVELOG ALL→DELETE NOPROMPT EXPIRED ARCHIVELOG ALL - 如果归档路径不在 FRA(比如用了
log_archive_dest_1),要额外检查该路径的磁盘空间和文件实际存在性 - 跨时区环境注意:
COMPLETED BEFORE 'SYSDATE-7'看的是v$archived_log.completion_time,不是系统时间戳 - Data Guard 环境下,只在主库执行;备库上运行
CROSSCHECK必须加FOR DB_UNIQUE_NAME <primary_name></primary_name>,否则默认查本地角色,可能漏标或误标
删除后控制文件还有残留记录怎么办?
即使 DELETE EXPIRED BACKUP 成功,LIST BACKUP 仍看到旧条目,常见于 STATUS = DELETED 的备份集或孤立的 BS_KEY 记录——这不是 bug,是 RMAN 元数据清理不级联。
-
LIST EXPIRED BACKUP能确认是否真有未清理项;若还有,说明CROSSCHECK没扫到全部路径 - 不要直接操作控制文件;唯一安全的手动方式是
CHANGE BACKUPSET <bs_key> UNCATALOG</bs_key>(仅适用于确认物理文件彻底丢失、且CROSSCHECK失败的个别条目) - 极端情况(如控制文件损坏或大量元数据错乱)才考虑重建控制文件,日常严禁
- 定期用
REPORT OBSOLETE+DELETE NOPROMPT OBSOLETE配合保留策略,比纯靠EXPIRED更可靠
CROSSCHECK,就会让后续所有 DELETE 变成无效操作。











