expired是rman控制文件中标记“路径存在但文件不可见”的状态,源于crosscheck执行stat()和头部读取失败,主因包括文件被删、挂载失效、路径错误或权限不足;它非错误码,仅提示元数据与物理实际脱节。
crosscheck backup 显示 expired 不是出错,是它在告诉你“控制文件里写的路径,我真没找到文件”
EXPIRED 状态到底意味着什么
EXPIRED 是 RMAN 控制文件中的一种状态标记,不是错误码,也不代表备份损坏。它只说明:RMAN 按照控制文件记录的 DEVICE TYPE DISK FORMAT 路径去调用系统 stat(),但返回了“文件不存在”。
- 物理文件可能被
rm、mv或清理脚本删掉了 - 备份目录挂载点失效(比如 NFS 断连、ASM 磁盘组 offline)
- 路径写错了——比如控制文件里记的是
/backup/rman/,实际文件在/u01/backup/ - 权限问题:Oracle 用户对目录只有
r-x,但CROSSCHECK需要能open()备份片头,某些 umask 下会失败
CROSSCHECK 不扫描内容,只校验存在性和头部可读性
它不会解压、不校验块校验和、不比对备份集内所有数据块。它只做两件事:
- 查路径是否存在(
stat()) - 尝试打开文件,读取前几百字节(备份片头),确认格式可识别
所以即使文件大小为 0、或内容全零、或被截断,只要头能读,CROSSCHECK BACKUPSET 仍可能标为 AVAILABLE;反之,哪怕文件完整挪过去,只要没用 CATALOG START WITH 重新注册,set_stamp 和 set_count 对不上,照样标 EXPIRED。
为什么 LIST BACKUP 显示 AVAILABLE,CROSSCHECK 后全变 EXPIRED
这是最典型的元数据脱节现象。常见于:
- 备份目录整体迁移后,没运行
CATALOG START WITH '/new/path/' - 归档日志被外部脚本清空,但控制文件还留着
v$archived_log记录 - Data Guard 切换后,主库控制文件未同步更新备库归档路径
- RMAN 备份命令里用了变量或软链接,而
CROSSCHECK默认不跟随符号链接
验证方法很简单:挑一个标为 EXPIRED 的条目,从 LIST BACKUP 输出里抄出 HANDLE,切到 oracle 用户执行:ls -l <handle></handle> 和 head -c 100 <handle></handle>。如果都失败,EXPIRED 就合理;如果成功,就得查挂载、权限或 ASM 别名是否一致。
容易被忽略的硬限制:CROSSCHECK 不等于 DELETE,也不触发自动修复
很多人跑完 CROSSCHECK BACKUP ALL 看到一堆 EXPIRED,就顺手 DELETE EXPIRED BACKUP —— 这步只从控制文件删元数据,磁盘文件还在。更危险的是,有人误以为“删了就干净了”,结果恢复时发现控制文件里没记录,但磁盘上其实有可用备份片(只是路径偏移了)。
真正安全的操作链是:
- 先
LIST BACKUP SUMMARY记下关键BS_KEY - 再
CROSSCHECK BACKUPSET ALL(别漏ALL) - 观察哪些变 EXPIRED,用
LIST BACKUP BY FILE对照实际位置 - 若路径偏移,用
CATALOG START WITH '/correct/path/'手动注册 - 确认无误后再
DELETE EXPIRED BACKUPSET
最后提醒一句:CROSSCHECK 是 I/O 密集型操作,大量备份时会卡住 RMAN 会话,别在业务高峰跑。它不解决路径错配,只暴露错配 —— 修复得靠你手动对齐。











