EXPIRED归档日志指控制文件有记录但磁盘文件已丢失,需先执行DELETE NOPROMPT EXPIRED ARCHIVELOG ALL清理元数据,再按COMPLETION_TIME删除真实归档,备库还需检查APPLIED状态和archive_gap后方可OS级清理。

expired归档日志说明控制文件里记着,但磁盘上已经没了
这通常是因为你或别人手动用 rm -f 删过归档,或者归档被第三方备份工具挪走但没通知RMAN。RMAN的 CROSSCHECK ARCHIVELOG ALL 一扫,发现记录还在、文件已失联,就标为 EXPIRED。它不是“还能用但过期了”,而是“元数据残留,物理文件早没了”。不清理它,会卡住FRA空间计算、干扰 DELETE OBSOLETE,甚至让后续备份报错。
必须先删EXPIRED记录,再删真实归档
DELETE NOPROMPT EXPIRED ARCHIVELOG ALL 是清理的第一步,也是最关键的一步——它只删控制文件里的无效条目,不碰磁盘(因为磁盘上本来就没有)。不做这步,直接跑 DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7' 可能失败,或误判空间余量。
- 执行顺序不能颠倒:一定是
CROSSCHECK→DELETE EXPIRED→ 再删真实归档 - 加
NOPROMPT避免交互阻塞,适合脚本;生产环境建议先加LIST EXPIRED ARCHIVELOG ALL看一眼数量 - 该操作不写归档、不触发checkpoint、无性能影响,可随时执行
delete archivelog all completed before 时间判断看的是COMPLETION_TIME
别用 SYSDATE - 7 硬套“7天前的文件”——Oracle归档的 COMPLETION_TIME 是写完归档并同步到磁盘的时间,比OS mtime 更准。尤其在Data Guard备库,归档可能延迟应用,COMPLETION_TIME 才是安全删除的依据。
- 错误做法:
DELETE ARCHIVELOG ALL BEFORE 'SYSDATE-7'(语法错,缺COMPLETED) - 正确写法:
DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7' - 更稳妥:如果归档刚应用完就删,MRP进程可能来不及读,建议留缓冲,比如用
SYSDATE-8
Data Guard备库上EXPIRED清理后仍有空间不足?那是物理残留
备库的 control_file_record_keep_time 默认是7天,超过这个时间的归档元数据会被自动老化清除,RMAN再也看不见它们——哪怕文件还躺在 /arch 目录下。这时 CROSSCHECK 不会标 EXPIRED,因为它根本不在控制文件里了。这类“失联文件”只能靠OS命令清,但必须守两个底线:
- 确认
SELECT MAX(SEQUENCE#) FROM v$archived_log WHERE applied = 'YES'的结果稳定,且v$archive_gap为空 - 确认这些文件的
COMPLETION_TIME <= SYSDATE - 15(比元数据保留窗口多留至少8天),再用find /arch -name "*.dbf" -mtime +15 -exec rm -f {} \; - 绝对不要在MRP进程非
APPLYING_LOG状态下执行物理清理
RMAN不会帮你管“控制文件之外”的文件,EXPIRED 是元数据层面的警报,而磁盘上沉默的残留才是压垮FRA的最后一根稻草。


















