CROSSCHECK 是 RMAN 维护的强制环节,用于校验控制文件记录与磁盘实际文件的一致性,将丢失文件标记为 EXPIRED,再配合 DELETE EXPIRED 才能清理脏元数据;它不可省略,否则 DELETE 失效或跳过,RESTORE 可能失败。
CROSSCHECK 不是可选项,而是 RMAN 维护的强制环节。它解决的核心问题是:**控制文件里记着的备份或归档日志,和磁盘上实际存在的文件,已经对不上了**。
这在生产环境几乎必然发生——比如手动清理 FRA、备份脚本误删、存储挂载异常、归档被外部备份软件挪走但没通知 RMAN。一旦不校验,DELETE 就会失效或跳过,RESTORE 可能选到已丢失的备份片。
crosscheck archivelog all 为什么必须跑?
归档日志最常“失踪”。你用操作系统命令 rm 或 find ... -delete 清理归档目录后,控制文件仍保留这些日志的记录,状态还是 available。
这时直接执行 DELETE ARCHIVELOG ALL,RMAN 会尝试去删物理文件——但文件早没了,结果要么报错 RMAN-06059(期望的归档日志不存在),要么静默跳过,脏记录继续留在控制文件里。
-
CROSSCHECK ARCHIVELOG ALL会逐条比对控制文件记录和磁盘实际路径,把已丢失的标为EXPIRED - 后续
DELETE EXPIRED ARCHIVELOG ALL才能干净清除元数据 - 注意:不能只靠
DELETE OBSOLETE,它不处理已丢失但未标记为EXPIRED的条目
crosscheck backup 和 crosscheck backupset 有啥区别?
两者都检查备份集,但语义和适用场景不同:
-
CROSSCHECK BACKUP是通用命令,覆盖所有类型备份(备份集、映像副本、归档、控制文件等),适合日常全量同步 -
CROSSCHECK BACKUPSET仅针对备份集(即BACKUPSET类型),在明确只关心 RMAN 备份集时用,略快但范围窄 - 12c+ 支持
CROSSCHECK BACKUP DEVICE TYPE SBT,但必须确保SBT_LIBRARY已加载,否则直接报RMAN-04006
物理文件还在,却被标成 EXPIRED 怎么办?
这不是 CROSSCHECK 出错了,而是 RMAN 校验逻辑比“文件存在”更严格——它验证的是备份片头里的 set_stamp 和 set_count 是否与控制文件中记录一致。
- 常见原因:文件被复制/移动过,但没用
CATALOG START WITH重新注册到 RMAN 目录 - 权限没问题,但元数据断连;哪怕
ls -l能看到文件,RMAN 仍判为EXPIRED - 解决方法:先
CATALOG START WITH '/path/to/backup/',再CROSSCHECK BACKUP
什么时候该触发 crosscheck?
不是按固定时间,而是按事件驱动:
- 每次手动清理过
FRA或归档目录后 - 执行
DELETE OBSOLETE前(避免漏删) - 发现
RESTORE报错找不到备份片时 - 切换备份介质(如从磁盘换到带库)后
- 数据库升级或打补丁后(尤其涉及 RMAN 元数据层变更)
真正容易被忽略的点是:crosscheck 不改变物理文件,只刷新元数据状态;而 delete expired 才真正清理控制文件记录——这两步必须配对使用,缺一不可。











