备库归档空间满导致恢复中断的根本原因是MRP进程主动暂停应用以规避风险,而非单纯磁盘满;其核心在于RMAN在备库无法管理超control_file_record_keep_time(默认7天)的物理残留归档,必须先校验applied='YES'且COMPLETION_TIME≤SYSDATE-7,再用find命令清理。

为什么备库归档空间满会导致恢复中断
根本原因不是磁盘满了,而是归档日志堆积后触发了保护机制:MRP(Managed Recovery Process)在发现归档文件未被应用、或归档路径不可写、或控制文件中记录的归档状态异常时,会主动暂停应用。此时 v$managed_standby 中 PROCESS = 'MRP0' 的 STATUS 变为 WAIT_FOR_LOG 或 NOT APPLYING,v$archive_gap 可能出现非空记录——这说明主库已发送但备库尚未应用的日志已断链。
RMAN delete archivelog 在备库上基本无效
备库默认不发起归档删除动作,configure archivelog deletion policy to applied on standby 这个配置对它只是摆设。RMAN 的 DELETE ARCHIVELOG 命令只作用于控制文件里有记录的归档;而备库的 control_file_record_keep_time 默认仅 7 天,超过这个时间的物理归档文件,即使还在磁盘上,RMAN 也完全“看不见”。你执行 DELETE OBSOLETE 或 CROSSCHECK,它连列表都不会显示那些旧文件。
常见错误现象:
– 执行 DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7' 后磁盘空间毫无变化
– RMAN> LIST EXPIRED ARCHIVELOG ALL 返回空集,但 /u02/archivelog 下堆着 2019 年的 *.dbf
- 别信“RMAN 能管住所有归档”——它只管最近
control_file_record_keep_time天内的 - 备库上
DELETE INPUT不触发校验逻辑,不会检查APPLIED = 'YES' - 强行在备库配 deletion policy,可能干扰 RAC 实例状态同步或后续升级
安全清理必须分两步:先查已应用,再删物理文件
核心逻辑只有两条:
① 只删 applied = 'YES' 且 COMPLETION_TIME ≤ SYSDATE - N 的归档(N 是业务允许的最小保留窗口,如 7 天)
② 物理文件必须用 find 清,不能只靠 RMAN
实操步骤:
- 第一步:确认 MRP 正常运行且无 GAP
SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM v$archive_gap;—— 必须返回空行SELECT PROCESS, STATUS, SEQUENCE# FROM v$managed_standby WHERE PROCESS = 'MRP0';——STATUS必须是APPLYING_LOG - 第二步:查出已应用归档的最大
SEQUENCE#(以 DEST_ID=2 为例,需先查v$archive_dest确认)SELECT MAX(SEQUENCE#) FROM v$archived_log WHERE applied = 'YES' AND DEST_ID = 2; - 第三步:生成可删归档的物理路径列表(加
COMPLETION_TIME二次过滤防误删)SELECT NAME FROM v$archived_log WHERE applied = 'YES' AND COMPLETION_TIME - 第四步:操作系统级清理残留(
+15是缓冲,比保留窗口多留 8 天)find /u02/archivelog -name "*.dbf" -mtime +15 -print0 | xargs -0 rm -f
清理后必须验证的三个状态点
删完不等于完事。很多故障复发,是因为跳过了验证环节:
- 立刻查
v$flash_recovery_area_usage:确认ARCHIVELOG的PERCENT_SPACE_USED降到 80% 以下 - 10 分钟内重查
v$managed_standby:确保 MRP 没因删太快卡在WAIT_FOR_GAP - 手动触发一次日志切换(主库执行
ALTER SYSTEM SWITCH LOGFILE;),观察备库是否能在 2 分钟内完成接收+应用
最容易被忽略的是:控制文件元数据老化导致的“假清理”——你以为删了,其实 RMAN 还记着那些文件的记录,下次 CROSSCHECK 会把它们标成 EXPIRED,但你不 DELETE EXPIRED,它们就继续占着恢复区统计空间。所以清理脚本末尾务必补一句:RMAN> DELETE NOPROMPT EXPIRED ARCHIVELOG ALL;。


















