EXPIRED是RMAN控制文件中标记“路径存在但文件不可见”的状态,源于CROSSCHECK执行stat()和头部读取失败,主因包括文件被删、挂载失效、路径错误或权限不足;它非错误码,仅提示元数据与物理实际脱节。
为什么CROSSCHECK后一堆EXPIRED,但文件明明还在磁盘上
物理文件存在却标为expired,大概率不是rman抽风,而是它校验失败了。rman不靠文件名或路径字符串匹配,而是读取备份片(backup piece)头部的set_stamp和set_count,再跟控制文件里记录的值比对。哪怕你把整个backupset完整拷过去,只要没用catalog start with重新注册,这两个值对不上,就直接标expired。
常见硬原因有三个:
-
DEVICE TYPE DISK FORMAT路径在控制文件里写的是/backup/rman/,实际文件放在/u01/backup/,RMAN连stat()都调用失败 - NFS挂载点断开、ASM磁盘组
OFFLINE,或者Oracle用户对目录只有r-x权限,无法open()读片头 - 备份是用其他DB或恢复目录注册的,当前控制文件没同步元数据,
RESYNC CATALOG没跑过
CROSSCHECK BACKUPSET ALL到底查什么、不查什么
CROSSCHECK BACKUPSET ALL只做两件事:对每个备份片调一次stat()系统调用,再尝试open()并读前几百字节(片头)。它不扫描内容、不校验块校验和、不检查归档日志是否可应用——所以即使文件大小为0、内容全零、或被截断,只要片头能读出来,状态仍可能是AVAILABLE。
执行时要注意:
- 默认不查
ARCHIVELOG和COPY,必须显式补上CROSSCHECK ARCHIVELOG ALL和CROSSCHECK COPY ALL - 只输
CROSSCHECK BACKUP会默认查最近一次备份集,历史条目全漏掉 - 大量备份时性能明显卡顿,别在业务高峰跑;12c+支持
DEVICE TYPE SBT,但要确认SBT_LIBRARY已加载,否则报RMAN-04006
EXPIRED不是错误,但DELETE EXPIRED之前必须确认三件事
EXPIRED只是状态标记,说明“我按控制文件写的路径找过,没找到”。它不等于文件永久丢失,更不等于可以无脑删。执行DELETE EXPIRED BACKUP前务必确认:
- 用
LIST BACKUP BY FILE核对实际文件位置,看是不是路径偏移了(比如从/fra/挪到了/backup/) - 用
ls -l对照LIST BACKUP输出的HANDLE,确认物理文件是否真不存在 - 如果用了Data Guard,备库上执行必须加
FOR DB_UNIQUE_NAME,否则可能误标主库还在用的归档为EXPIRED
漏掉任一环节,就可能出现“删完发现备份还在磁盘上,但控制文件里记录没了”的尴尬局面。
删完EXPIRED,控制文件里还剩STATUS=DELETED记录怎么办
DELETE EXPIRED BACKUP只清理RC_BACKUP_SET主表里的记录,不会自动清理关联的碎片。比如RC_BACKUP_PIECE表中残留的备份片条目、归档日志与备份的绑定关系,都可能还在。这时不要手改控制文件。
安全做法是:
- 先确认物理路径确实无文件:
ls -l逐个比对LIST BACKUP输出的HANDLE - 对单个无法
CROSSCHECK成功的备份,用CHANGE BACKUPSET显式注销UNCATALOG - 若怀疑权限或挂载问题,先修复OS层访问能力,再重跑
CROSSCHECK,而不是跳步直接删
最常被忽略的一点:EXPIRED是元数据脱节信号,不是清理指令。它提醒你该去验证物理一致性了,而不是立刻执行删除动作。











