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)或共享文件系统路径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',避免某节点静默停归档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'
LIST ARCHIVELOG ALL 卡住,缩小扫描范围:LIST ARCHIVELOG FROM TIME 'SYSDATE-5'
FORCE 参数,否则 MRP 正在读的归档会被跳过:DELETE NOPROMPT FORCE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-2'
RMAN 只能删控制文件里还保留元数据的归档(默认保留约 7 天,由 control_file_record_keep_time 控制)。那些“三年前的 *.dbf”RMAN 根本不认,但它们占着 90% 的空间。这步不能跳过:
/u01/fast_recovery_area/DBNAME/archivelog 或 asmcmd 进入对应 ASM 别名路径)find . -name "*.dbf" -mtime +15 -ls,确认全是超期且不在当前备份集里的文件find . -name "*.dbf" -mtime +15 -delete(注意:别漏掉 -delete,-ls 只是预览)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 LOG 的 PERCENT_SPACE_USED 已回落至 80% 以下;若仍高,说明 FRA 配额(db_recovery_file_dest_size)本身设得太小,需 ALTER SYSTEM SET db_recovery_file_dest_size=xxG
GV$PARAMETER 同步生效,尤其 DG 场景中主库归档传输状态(log_archive_dest_state_2)是否为 ENABLE
最易被忽略的是:手工删完物理文件后忘记 CROSSCHECK,导致控制文件里残留“已删但未标记”的记录,下次归档切换时仍报 ORA-00257 —— 表面空间够了,实际归档通道依然堵死。