必须先确认归档已完全应用、无gap、mrp进程正常,再分两步清理:rman同步元数据+安全删除已应用归档;残留物理文件须用find手工清理,rman对其不可见。

备库磁盘空间爆满导致 Data Guard 停滞,必须立刻停止盲目删文件,先确认归档已完全应用、无 GAP、MRP 进程状态正常,再分两步清理:RMAN 同步元数据 + 安全删除已应用归档;残留物理文件必须用 find 手工清理,RMAN 对它们完全不可见。
怎么快速确认备库是否真有 GAP 且 MRP 已停摆
别只看 v$archive_gap 返回空就以为安全——它只反映传输层缺口,不保证已应用。真正卡点是 MRP 进程是否还在推进:
- 查
v$managed_standby中PROCESS = 'MRP0'的STATUS:若为WAIT_FOR_LOG但SEQUENCE#长期不变(比如超 15 分钟),基本就是卡住了 - 执行
SELECT thread#, low_sequence#, high_sequence# FROM v$archive_gap;—— 必须返回空行;否则说明主库归档没传过来,得先修传输链路 - 查
v$archived_log最近 10 条:SELECT sequence#, applied, completion_time FROM v$archived_log ORDER BY completion_time DESC FETCH FIRST 10 ROWS ONLY;—— 如果APPLIED = 'NO'的记录大量堆积,且COMPLETION_TIME超过 1 小时,说明 apply 已滞后
为什么直接 rm -f 归档文件会彻底搞崩同步
控制文件里还存着这些文件的元数据,rm 后 RMAN 再次 CROSSCHECK 会把它们标为 EXPIRED,但 delete 操作可能报 RMAN-08137(无法删除未应用日志)或静默跳过,空间还是不释放。更糟的是:
- MRP 进程下次尝试读取时发现文件不存在,直接报
ORA-19505或ORA-27037,然后中止,不再自动重试 -
v$archived_log里对应记录的STATUS可能变成U(unknown),后续APPLIED = 'YES'判断失效 - 如果误删了还没被 MRP 读取的归档(哪怕只差一个 sequence),就会触发不可逆 GAP,只能重建备库
用 RMAN 安全清理已应用归档的三步实操
进 RMAN 前确保已通过 SQL 确认 APPLIED = 'YES' 的归档存在,且无 GAP:
- 第一步强制同步元数据:
CROSSCHECK ARCHIVELOG ALL;—— 把磁盘上缺失的文件标记为EXPIRED - 第二步清掉“僵尸记录”:
DELETE NOPROMPT EXPIRED ARCHIVELOG ALL;—— 这步释放控制文件空间,避免后续操作报错 - 第三步删真实已应用归档:
DELETE NOPROMPT ARCHIVELOG UNTIL TIME 'SYSDATE - 3';—— 注意单引号不能少;时间窗口建议从 3 天起步,别一上来就设 7 天;若备库有多个归档目标(如 DEST_ID=1 是本地文件系统,DEST_ID=2 是 ASM),加FROM DEST_ID 1显式指定,防误删
为什么删完 RMAN 能管的归档后空间还不见涨
因为控制文件默认只保留 control_file_record_keep_time(Oracle 11g 默认 7 天)内的归档元数据。超过这个时间的物理归档文件,RMAN 根本“看不见”,也就无法管理。它们不是过期,而是失联:
- 这类文件只能靠操作系统命令清理,例如:
find /u02/archivelog -type f -mtime +15 -name "*.dbf" -exec rm -f {} \; - 执行前务必确认:数据库已连续运行超 7 天、无全库恢复操作、且无第三方备份工具正在扫描该目录
- 删完后查
V$FLASH_RECOVERY_AREA_USAGE,重点关注ARCHIVELOG行的PERCENT_SPACE_USED—— 控制文件统计刷新有延迟,等 5–10 分钟再查;若长期不降,可能是control_file_record_keep_time被调小过,需评估调整
最易被忽略的点是:清理完别急着重启 MRP,先查 v$recovery_progress 和 v$archive_dest_status 确认 DEST_ID=2(或对应 DG 目标)的 STATUS = 'VALID' 且 ERROR 为空,再执行 ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT; —— 缺这一步,MRP 可能带着旧错误上下文重新拉起,几秒后又挂。











