RMAN不自动清除控制文件冗余记录,必须先执行CROSSCHECK命令扫描磁盘并将丢失备份标记为EXPIRED,之后DELETE EXPIRED BACKUP才能生效;否则因无EXPIRED记录而返回“0 objects deleted”。
直接说结论:rman 本身不“清除控制文件记录”,它只清理控制文件里已标记为 expired 的备份元数据;真正让冗余记录变可删的动作,是 crosscheck —— 它强制 rman 扫描磁盘并把丢失的备份打上 expired 标签。
为什么 DELETE EXPIRED BACKUP 总是返回 “0 objects deleted”
这不是命令写错了,而是控制文件里压根没有 EXPIRED 状态的记录。物理备份文件被 rm、迁移或 FRA 自动清理后,控制文件仍长期保留 AVAILABLE 状态。RMAN 的 DELETE EXPIRED 只删状态,不扫描磁盘。
-
CROSSCHECK BACKUPSET ALL必须执行,否则只检查最近一次备份集 -
CROSSCHECK COPY ALL覆盖所有BACKUP AS COPY或DUPLICATE生成的映像副本 -
CROSSCHECK ARCHIVELOG ALL关键一步,尤其当归档在 FRA 外独立路径时 - 用了恢复目录(recovery catalog)?必须补
RESYNC CATALOG,否则元数据不同步
Data Guard 环境下 CROSSCHECK ARCHIVELOG 的坑
在备库上直接跑 CROSSCHECK ARCHIVELOG ALL 极危险:RMAN 默认按本地 DB_UNIQUE_NAME 匹配,可能把主库刚传过来、尚未应用的归档标为 EXPIRED,后续 DELETE EXPIRED ARCHIVELOG 就真删了,破坏恢复链。
- 主库操作:直接运行全套
CROSSCHECK命令即可 - 备库操作(仅限必要场景):
CROSSCHECK ARCHIVELOG ALL FOR DB_UNIQUE_NAME <primary_db_name>,显式限定作用域 - 删前确认:
SELECT MAX(sequence#), applied FROM v$archived_log GROUP BY applied;,确保待清理归档已APPLIED = 'YES'
删完 EXPIRED 后控制文件里还有残留记录怎么办
这是正常现象。RMAN 不自动清理碎片关联,比如 RC_BACKUP_PIECE 表中残留的备份片条目、归档与备份的未解绑关系等。不能直接改控制文件或删系统表。
- 先确认物理路径是否真无文件:
ls -l对照LIST BACKUP输出的HANDLE - 对确认丢失且无法
CROSSCHECK的单个备份,用CHANGE BACKUPSET <BS_KEY> UNCATALOG显式注销 - 归档日志顽固残留?补一句
CHANGE ARCHIVELOG ALL CROSSCHECK再跑DELETE NOPROMPT EXPIRED ARCHIVELOG ALL -
CROSSCHECK是 I/O 密集型操作,尤其当备份量大、存储慢时,别在业务高峰跑
最易被忽略的一点:CROSSCHECK 不是“一键清理”,它是“主动发现失效”的前置动作。跳过它就等于让 RMAN 对着一张过期地图找车——自然找不到,也删不掉。


















