crosscheck backupset能发现损坏备份,是因为它真实访问每个备份片路径、尝试打开并读取头部信息,若失败则将控制文件中状态从AVAILABLE更新为EXPIRED。
crosscheck backupset 为什么能发现损坏的备份
rman 不会主动扫描磁盘上的备份文件是否可读或完整,它只依赖控制文件(或恢复目录)中记录的元数据。当备份文件被意外删掉、磁盘损坏、权限变更或 nfs 挂载异常时,backupset 在控制文件里仍标记为 available,但物理上已不可用。执行 crosscheck backupset 会让 rman 真实去访问每个备份片路径,逐个尝试打开并读取头部信息。如果失败,状态就从 a 变成 x(expired)。
常见错误现象包括:
- RMAN 报错
RMAN-06471: no backup piece found或RMAN-06010: error while looking for backup piece -
list backupset显示存在,但restore database失败,提示找不到对应备份片 - 备份目录下文件存在,但大小为 0 或权限为
---------
crosscheck backupset 后该不该直接 delete expired
不能跳过 crosscheck 直接 delete expired —— 因为没有先校验,控制文件里根本没 EXPIRED 条目,delete expired 实际不生效。必须两步走:
- 先运行
crosscheck backupset(或指定具体编号如crosscheck backupset 1234),触发状态刷新 - 再运行
delete expired backupset(不是delete backupset),仅清理被标记为X的条目 - 如果想连带清理过期归档,需额外执行
crosscheck archivelog all+delete expired archivelog all
注意:delete expired 是元数据清理,不碰磁盘文件;而 delete backupset 是真删文件,慎用。
crosscheck 失败时的典型路径问题
很多 crosscheck 报 validation failed 并非文件真损坏,而是路径/权限/挂载层面的问题:
- 备份写在 NFS 上,但当前节点未挂载,或挂载参数含
noac导致元数据缓存不一致 - 备份路径含软链接,RMAN 默认不跟随(尤其在使用快照控制文件时)
- Oracle 用户对备份目录只有读权限,但
crosscheck需要至少执行stat()和部分 open(),某些严格 umask 下会失败 - 使用 ASM 时路径写成
+DATA/…,但未用ASMCMD校验实际别名或磁盘组状态
验证方式很简单:切到 oracle 用户,手动 ls -l 和 head -c 100 /path/to/xxx.bkp 看能否读取开头字节。
crosscheck 和 validate backup 的本质区别
crosscheck 只确认“文件是否存在、能否打开”,不校验内容;validate backup 才真正读取备份块做 CRC 校验,开销大得多:
-
crosscheck backupset 1234:秒级完成,适合日常巡检 -
validate backupset 1234:可能耗时数分钟,且要求数据库处于 MOUNT 或 OPEN 状态 - 若需查逻辑损坏(比如块内数据不一致),必须加
check logical,例如:validate backupset 1234 check logical - 生产环境建议每周对关键全备跑一次
validate,但crosscheck应嵌入每日备份脚本末尾
真正容易被忽略的是:crosscheck 不会自动重试或跳过临时 I/O 错误,一次失败就标为 EXPIRED —— 如果是偶发网络抖动或存储瞬断,得人工确认后再决定是否 delete expired。











