crosscheck不是修复命令,仅更新rman元数据状态而不删除或恢复物理文件;它校验控制文件中记录的归档日志是否存在,存在则标available、不存在则标expired,但不扫描磁盘查找漏记文件,也不验证内容完整性。

CROSSCHECK 不是修复命令,它只更新 RMAN 元数据状态,不删除或恢复任何物理文件。 你看到 EXPIRED 状态时,别急着删——先确认文件是否真丢了,还是只是路径变了、权限不对、或备份介质没挂载。
什么时候必须用 crosscheck archivelog all
归档日志备份失败、RMAN-06059: expected archived log not found 报错、list archivelog all 显示大量 EXPIRED 条目,但实际归档目录里文件还在——这说明控制文件里记录的归档位置/状态和磁盘现状不一致。
- 常见诱因:手动清空
$ORACLE_BASE/fast_recovery_area/<dbname>/archivelog/</dbname>目录,但没同步控制文件 - 归档目标路径被修改(比如从
+FRA改到/u01/arch),旧归档未迁移或未重新 catalog - 使用了第三方备份工具(如 Veritas)干扰归档日志生命周期管理
- 数据库重启后归档进程异常,部分归档未写入控制文件
执行 crosscheck archivelog all 后,RMAN 会逐个检查控制文件中记录的每个归档日志物理是否存在。存在 → 状态维持 AVAILABLE;不存在 → 标为 EXPIRED。注意:它不会扫描磁盘找“漏记”的归档,只校验已有记录。
crosscheck backup 和 crosscheck copy 的关键区别
crosscheck backup 针对备份集(BACKUPSET),即 backup database 生成的压缩二进制文件;crosscheck copy 针对映像副本(IMAGE COPY),即 backup as copy 或 copy datafile 生成的原始数据文件副本。两者状态含义相同,但物理格式和用途完全不同:
- 备份集不可直接 restore,必须通过 RMAN 解包;映像副本可直接 cp 替换原数据文件(需数据库 offline)
- 若用 SBT(如 TSM、NetBackup)做备份,
crosscheck backup必须提前allocate channel for maintenance device type 'sbt',否则报错RMAN-06026: some objects not found -
crosscheck copy of datafile 4只检查编号为 4 的数据文件映像副本,不涉及其他文件或归档 - 跨数据库版本或 PDB 插拔后,pre-plugin 备份需在 CDB open read-write 下以
SYSDBA连接才能 crosscheck
执行 crosscheck 后为什么还报错?
因为 crosscheck 只改状态,不清理逻辑残留。典型场景:
- 归档日志已删,
crosscheck archivelog all把它们标成EXPIRED,但后续backup archivelog all delete input仍会失败——RMAN 拒绝处理EXPIRED对象 - 备份集文件被误删,
crosscheck backup标为EXPIRED,但delete obsolete不会动它,因为obsolete和expired是两套机制 - 真正要清理,得配对执行:
delete expired archivelog all或delete expired backup - 切勿在未确认物理缺失前执行
delete expired——万一文件只是临时不可达(如 NFS 挂载中断),删完就真丢了
最易被忽略的是:crosscheck 不验证文件内容完整性,只检查 header 是否可读(disk)或媒体管理器是否返回存在(tape)。一个损坏但 header 完好的备份集,依然显示 AVAILABLE,restore 时才会暴露问题。











