必须先确认备库归档已全部应用且无gap,再执行rman清理和手动删除;否则将导致mrp中断、备库脱机。需依次检查v$archived_log、v$archive_gap、v$managed_standby状态,执行crosscheck同步元数据,再按completion_time删除归档,并确保归档路径指向asm或共享存储。

确认备库归档是否已应用且无 GAP
这是所有操作的前提。误删未应用归档,MRP 进程立刻中断,备库脱机,重建代价远高于空间问题本身。
- 查最新已应用归档:
SELECT MAX(SEQUENCE#) FROM v$archived_log WHERE applied = 'YES' AND DEST_ID = 2(DEST_ID需先从v$archive_dest确认,常见为 1 或 2) - 查 GAP:
SELECT * FROM v$archive_gap,返回空集才安全 - 查 MRP 状态:
SELECT process, status, sequence# FROM v$managed_standby WHERE process = 'MRP0',必须是APPLYING_LOG且sequence#持续增长
若发现 applied = 'NO' 或 v$archive_gap 非空,先解决传输或应用卡顿——比如重启 MRP:ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT
RMAN 清理“看得见”的归档(控制文件内有记录的部分)
这步不能跳过。不执行 CROSSCHECK 就直接删,RMAN 可能静默跳过、报 RMAN-08137,或留下元数据脏记录,影响后续日志应用。
-
CROSSCHECK ARCHIVELOG ALL:强制扫描物理文件,同步磁盘与控制文件状态 -
DELETE NOPROMPT EXPIRED ARCHIVELOG ALL:清理标记为EXPIRED的元数据(如被 mv 走但未同步的文件) -
DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-15':按COMPLETION_TIME删除,比UNTIL TIME更稳妥,避免误删
注意:备库上执行前必须确保 applied = 'YES',否则删了未应用归档会触发 GAP,同步断裂
手动删除 RMAN “看不见”的老归档文件
控制文件默认只保留约 7 天元数据(由 control_file_record_keep_time 控制),超期文件 RMAN 根本不识别,但它们占着大量磁盘空间。
- 先进入归档目录:
cd /oracle/app/archivelog(路径以v$archive_dest中DESTINATION值为准) - 安全预览(确认范围):
find . -name "*.dbf" -mtime +15 -ls - 正式清理:
find . -name "*.dbf" -mtime +15 -delete
务必确认这些文件已远超业务恢复窗口(如备份策略只要保留 14 天),且不在任何 RMAN 备份集中;否则可能破坏可恢复性
检查归档目标路径是否指向共享存储或 FRA
如果备库归档写入本地文件系统(如 /u01/arch),而主库写入 ASM 或 NFS,极易因路径隔离导致备库归档堆积无人监控。
- 查当前配置:
SELECT DESTINATION, STATUS, TARGET FROM v$archive_dest WHERE DEST_ID = 2 - 理想配置:备库
log_archive_dest_2应指向统一 ASM 磁盘组(如+FRA)或共享 NFS 路径,而非本地目录 - 临时规避:若无法立即改路径,需在备库所在主机部署定时清理脚本,并加锁、校验状态、记录日志
最易被忽略的是:归档目录爆满后,很多人只清文件,却没检查 log_archive_dest_n 是否仍指向一个不可写的挂载点——下次归档照样失败











