CROSSCHECK BACKUP 标记 EXPIRED 是因控制文件记录与物理文件不一致,并非故障;它仅校验存在性,不扫描文件内容,需配合 CATALOG 和 DELETE EXPIRED 实现元数据同步。
为什么 CROSSCHECK BACKUP 有时“没反应”或显示 EXPIRED
它不扫描磁盘文件,只比对控制文件里记录的备份条目和实际介质(磁盘/磁带)上的文件是否存在。如果备份文件被手动删了、路径改了、或者控制文件没更新过,crosscheck 就会把对应条目标记为 expired——但这不是 bug,是它在尽责地告诉你“我查不到这个文件了”。
- 常见错误现象:
LIST BACKUP显示一堆AVAILABLE,但CROSSCHECK BACKUP后全变EXPIRED→ 很可能备份文件根本不在控制文件里写的DEVICE TYPE DISK FORMAT路径下 - 使用场景:RMAN 备份目录迁移后、归档日志被清理脚本误删后、DG 备库切换后主库控制文件未同步更新
- 参数差异:
CROSSCHECK BACKUP默认只检查BACKUPSET;要覆盖ARCHIVELOG或COPY,得显式写CROSSCHECK ARCHIVELOG ALL或CROSSCHECK COPY - 性能影响:对每个备份片发起一次 OS 层 stat() 调用,大量备份时会明显卡顿,别在业务高峰跑
CROSSCHECK 和 DELETE EXPIRED 不是一体操作
执行 CROSSCHECK BACKUP 只改控制文件状态,不会删任何物理文件;而 DELETE EXPIRED 才会从控制文件里清除那些标记为 EXPIRED 的记录——但它依然不碰磁盘文件。真要删物理文件,得用 DELETE NOPROMPT BACKUP 或手动 rm。
- 容易踩的坑:有人
CROSSCHECK后立刻DELETE EXPIRED,以为清了“无效备份”,结果恢复时发现控制文件里连备份信息都没了,但磁盘上其实还有可用备份片(只是路径不一致) - 安全做法:先
LIST BACKUP SUMMARY记下关键 backup_key,再CROSSCHECK,观察哪些变EXPIRED,最后用LIST BACKUP BY FILE核对实际文件位置是否偏移 - 兼容性注意:12c 以后支持
CROSSCHECK BACKUP DEVICE TYPE SBT,但需确保SBT_LIBRARY正确加载,否则直接报RMAN-04006
物理文件存在却仍被标为 EXPIRED 的三个硬原因
不是权限问题就是元数据断连。RMAN 不靠文件名匹配,而是校验备份片头里的 set_stamp、set_count 和控制文件中记录的是否一致。哪怕文件完整挪过去,只要没用 CATALOG START WITH 重新注册,就对不上。
- 路径大小写敏感:Linux 上
/BACKUP/和/backup/是两个路径,控制文件里存的是小写,但你mv时保留了大写 →CROSSCHECK必挂 - 文件系统挂载点变更:比如原备份在
/u01/backup,后来挂到/backup,但控制文件还记着旧路径 → 必须用CATALOG START WITH '/backup/'手动补录 - 控制文件重建过:没有从旧控制文件
BACKUP CONTROLFILE TO TRACE恢复,新控制文件里压根没那些备份记录 →CROSSCHECK当然全EXPIRED
真正同步物理文件与控制文件的最小闭环动作
单靠 CROSSCHECK 永远做不到“同步”,它只是校验者。要让控制文件认知和磁盘现状一致,必须组合动作。
- 确认物理文件真实位置:
find /your/backup/path -name "*.bkp" -o -name "full_*",比对LIST BACKUP输出的BS Key和Completion Time - 批量重注册缺失备份:
CATALOG START WITH '/new/backup/path/';(注意结尾斜杠不能少) - 清理已确认丢失的记录:
DELETE EXPIRED BACKUP;(仅删控制文件条目) - 验证闭环:
LIST BACKUP SUMMARY;看STATUS是否全为AVAILABLE,且数量与磁盘文件数大致吻合
最常被忽略的是:CATALOG 命令不递归子目录,如果备份分散在多级目录,得对每层路径分别执行 CATALOG START WITH,否则漏掉的备份永远处于“不可见但物理存在”的灰色状态

















