如何处理Oracle RAC中因Archivelog满导致的整个集群挂起

作者:袖梨 2026-06-24
Oracle RAC因归档日志满导致集群挂起的本质是归档写入失败引发连锁反应:节点无法切换日志→LGWR阻塞→DML挂起→CRS状态更新停滞→最终节点驱逐或crsctl卡死;必须同步清理空间与修复归档路径可用性,单做RMAN删除往往无效。

oracle rac 因归档日志满导致集群挂起,本质不是“日志太多”,而是归档写入失败触发连锁反应:节点无法切换日志 → lgwr 阻塞 → 所有 dml 挂起 → crs 资源状态更新停滞 → 最终表现为节点驱逐、crsctl check crs 卡死或返回 crs-4638 但后续命令无响应。必须同步清理空间与修复归档路径可用性,单做 rman 删除往往无效。

确认归档目标是否真为共享路径

RAC 中常见误判:某个节点执行 ARCHIVE LOG LIST 显示 NO,就以为归档没启用,其实只是该节点本地路径已满,而共享归档目录(如 +FRA 或 NFS 挂载点)早已写满。关键动作是查真实归档位置:

  • 在每个节点执行:SHOW PARAMETER log_archive_dest_1,确认 LOCATION 值是否指向 ASM 磁盘组(如 +FRA)或共享文件系统路径
  • 若用 ASM,用 asmcmd lsdg 查对应磁盘组使用率;若用文件系统,用 df -h 查挂载点,而非只看单个节点的 /u01/arch
  • 检查所有节点的 log_archive_dest_state_1 是否均为 ENABLE:运行 SELECT INST_ID, VALUE FROM GV$PARAMETER WHERE NAME = 'log_archive_dest_state_1',避免某节点静默停归档

RMAN 清理必须按节点+实例连接,不能跨节点通杀

RAC 下 RMAN 默认不感知集群锁机制,用 target / 连接远程 TNS 别名时,可能并发删同一份归档,触发 ORA-19606 或静默跳过。正确做法是:

  • 在每个数据库节点,先设置 ORACLE_SID 为本节点实例名(如 orcl1),再执行:rman target /
  • 避免用 DELETE ARCHIVELOG ALL —— 改用时间范围限定:DELETE NOPROMPT FORCE ARCHIVELOG FROM TIME 'SYSDATE-7' COMPLETED BEFORE 'SYSDATE-1'
  • 如果归档在 ASM 中且 LIST ARCHIVELOG ALL 卡住,缩小扫描范围:LIST ARCHIVELOG FROM TIME 'SYSDATE-5'
  • 备库上必须加 FORCE 参数,否则 MRP 正在读的归档会被跳过:DELETE NOPROMPT FORCE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-2'

手动清理 RMAN 看不见的历史残留文件

RMAN 只能删控制文件里还保留元数据的归档(默认保留约 7 天,由 control_file_record_keep_time 控制)。那些“三年前的 *.dbf”RMAN 根本不认,但它们占着 90% 的空间。这步不能跳过:

  • 先进归档目录(如 /u01/fast_recovery_area/DBNAME/archivelogasmcmd 进入对应 ASM 别名路径)
  • 预览再删:find . -name "*.dbf" -mtime +15 -ls,确认全是超期且不在当前备份集里的文件
  • 执行删除:find . -name "*.dbf" -mtime +15 -delete(注意:别漏掉 -delete-ls 只是预览)
  • 删完立刻回 RMAN 执行:CROSSCHECK ARCHIVELOG ALL,否则 V$ARCHIVED_LOG 会残留脏状态,DG 备库可能卡在 WAIT_FOR_GAP

清理后必须验证归档可写,否则挂起会复发

空间释放 ≠ 归档恢复。常见遗漏点:

  • 在每个节点执行:ALTER SYSTEM ARCHIVE LOG CURRENT,观察 alert.log 是否出现新归档记录(如 ARC0: Archiving not possible. Archive destination LOG_ARCHIVE_DEST_1 is full
  • V$FLASH_RECOVERY_AREA_USAGE,确认 ARCHIVED LOGPERCENT_SPACE_USED 已回落至 80% 以下;若仍高,说明 FRA 配额(db_recovery_file_dest_size)本身设得太小,需 ALTER SYSTEM SET db_recovery_file_dest_size=xxG
  • RAC 环境下,哪怕只在一个节点上改了参数,也要确认所有节点的 GV$PARAMETER 同步生效,尤其 DG 场景中主库归档传输状态(log_archive_dest_state_2)是否为 ENABLE

最易被忽略的是:手工删完物理文件后忘记 CROSSCHECK,导致控制文件里残留“已删但未标记”的记录,下次归档切换时仍报 ORA-00257 —— 表面空间够了,实际归档通道依然堵死。

相关文章

精彩推荐