<p>必须先确认备库归档已完全应用且无传输GAP,再执行crosscheck标记失效记录、delete expired清理元数据,最后用delete noprompt archivelog until time 'SYSDATE - 3'删除已应用归档;否则将导致v$archived_log状态错乱、RMAN-08137报错或日志应用中断。</p>

不能直接 rm -f 删除备库归档文件,否则控制文件仍保留记录,v$archived_log 状态错乱,RMAN-08137 报错,甚至中断日志应用;必须先确认已应用、再同步元数据、最后按时间窗口删。
确认备库已完全应用且无传输 GAP
跳过这步就删,极大概率导致同步中断或需重建备库。重点查三处:
-
v$archived_log中只认APPLIED = 'YES'的归档,STATUS = 'A'仅作辅助参考 - 执行
select thread#, low_sequence#, high_sequence# from v$archive_gap;—— 必须返回空结果才算无 GAP - 在主库查
v$archive_dest_status,确保对应 DG 目标的STATUS = 'VALID'且ERROR为空 - 检查备库
v$managed_standby中MRP0进程状态为APPLYING_LOG,不能是WAIT_FOR_LOG或IDLE
进 RMAN 后先 crosscheck archivelog all 再 delete expired
手动删过文件、或归档路径变更过,控制文件里常残留“幽灵记录”。不先做这步,后续 delete archivelog until time 会静默跳过它们,空间根本清不掉。
- 进 RMAN 后立刻执行
crosscheck archivelog all;—— 把磁盘上不存在的归档标为EXPIRED - 紧接着执行
delete noprompt expired archivelog all;—— 清掉这些僵尸记录 - 这一步不做,
delete archivelog until time可能报RMAN-08137,或看似成功实则未释放空间
用 delete archivelog until time 安全删已应用归档
别用 delete archivelog all,也别依赖 delete input(备库没做 backup archivelog 时它不生效)。按时间窗口最可控,但必须确保前面已确认 APPLIED = 'YES'。
- 执行
delete noprompt archivelog until time 'SYSDATE - 3';—— 删 3 天前所有已应用归档 - 时间表达式必须带单引号,
SYSDATE - 3是标准写法;SYSDATE - 72容易出错,不建议 - 如果备库有多个归档目标(如本地文件系统 + ASM),加
from dest_id 1显式指定,避免误删 -
until time查的是FIRST_TIME,不如COMPLETED BEFORE稳妥;但在备库,只要确认了APPLIED = 'YES',两者差异不大
清理后空间没降?别急着重试
删完不等于空间立刻释放。V$FLASH_RECOVERY_AREA_USAGE 中 ARCHIVELOG 行的 PERCENT_SPACE_USED 可能延迟更新,常见卡点是控制文件统计滞后。
- 等 5–10 分钟再查
select * from V$FLASH_RECOVERY_AREA_USAGE; - 若长期不降,检查
control_file_record_keep_time是否设得太小(默认 7),导致旧归档元数据被覆盖,RMAN “看不见”但物理文件还在 - 这类“失联文件”只能靠
find /path/to/arch -name "*.arc" -mtime +15 -delete手动清理,但前提是:确认无 PITR 需求、无第三方备份工具正在读取、且数据库已连续运行超 7 天


















