如何从RAC集群中删除故障节点_rootcrs.sh -deconfig与节点清理

1次阅读

执行 _rootcrs.sh -deconfig 前必须先手动停止所有 CRS 资源并确认无残留进程,否则易卡住或报错;需根据 GI 版本选择对应脚本(11.2 用_rootcrs.sh,12.1+ 用 rootcrs.pl),并清理 OCR、网络、存储等操作系统层残留。

执行 _rootcrs.sh -deconfig 前必须停掉该节点所有 CRS 资源

直接在故障节点上跑 _rootcrs.sh -deconfig 很可能卡住或报错,因为脚本会尝试停止 ora.crsdora.asm 等资源,而这些资源若处于异常挂起状态(比如 asm 实例僵死、ocr 无法访问),就会导致清理中断。

实操建议:

  • 先用 crsctl check cluster -all 确认其他节点是否健康,避免误删正常节点
  • 在待清理节点上,手动逐个停资源:crsctl stop resource -all;若失败,加 -f 强制:crsctl stop resource -all -f
  • 确认 ps -ef | grep d.binohasdcrsdcssd 进程残留,否则 _rootcrs.sh 会拒绝继续
  • 注意:不能只依赖 crsctl stop crs —— 在 11.2+ 中它不保证停掉 ASM,而 _rootcrs.sh -deconfig 内部仍会调 OCR/ASM 相关检查

_rootcrs.sh -deconfig 在不同 GI 版本行为差异极大

11.2.0.3 之前版本的 _rootcrs.sh -deconfig 默认不清理 OCR 和 Voting Disk 元数据;12.1+ 则默认尝试从集群维度移除该节点注册信息,但前提是 OCR 可写且当前节点能连上 OCR 设备。

常见错误现象:CRS-4639: Could not contact Oracle High Availability ServicesORA-15032: not all alterations performed —— 本质是脚本试图读 OCR 时失败,却未给出明确提示。

实操建议:

  • 查清 GI 版本:crsctl query crs activeversion,再决定是否加 -force 或跳过 OCR 校验
  • 11.2.0.4 及以后:推荐加 -verbose -force,避免交互阻塞;但 -force 不等于跳过 OCR 检查,只是跳过部分守护进程状态校验
  • 若 OCR 存于 ASM 且该节点 ASM 已不可用,需先在其他健康节点上用 crsctl delete node -n <nodename> 主动删除节点元数据,再回故障节点跑 _rootcrs.sh -deconfig

删完节点后,rootcrs.pl -deconfig -force_rootcrs.sh 别混用

_rootcrs.sh 是 11.2 的 shell 封装脚本,而 rootcrs.pl 是 12.1+ 的 Perl 主入口。两者参数名相似但逻辑不同:rootcrs.pl -deconfig -force 会尝试清理本地 ORACLE_HOME 下所有 GI 配置文件(包括 olsnodes 缓存、gpnp profile),而 _rootcrs.sh -deconfig 更“轻量”,主要停服务 + 清 /etc/oracle 下软链。

容易踩的坑:

  • 在 12.1 GI 上误用 _rootcrs.sh(尤其从旧文档抄的命令),可能导致 ora.cluster_interconnect.haip 资源残留,后续加节点时报 CRS-2672: Attempting to start 'ora.cluster_interconnect.haip' 卡住
  • rootcrs.pl -deconfig 执行后会自动运行 roothas.pl -deconfig(如果启用了 HAS 模式),但 _rootcrs.sh 不会——这点常被忽略,导致单节点 RAC 误删后 HAIP 仍绑定网卡
  • 无论用哪个脚本,执行完都应检查:ls -l /etc/oracle/scls_scr 是否为空、cat /etc/oracle/ocr.loc 是否只剩有效路径、ifconfig -a | grep haip 是否无输出

网络与存储配置残留比 CRS 清理更难排查

脚本能干掉 CRS 进程和配置文件,但不会碰操作系统层的东西:比如多路径设备别名(/etc/multipath.conf)、私网绑定(/etc/hosts 里的 private IP)、ASMLIB 标签(oracleasm listdisks 输出)、甚至 udev 规则里对 ASM 磁盘的权限设置。

这些残留不阻止当前节点“被清理”,但会干扰后续重建或影响其他节点识别磁盘拓扑。

实操建议:

  • 删节点前,先在其他节点运行 ls -l /dev/oracleasm/disks/ 记下磁盘列表,删完后比对是否多出孤立设备名
  • 检查 /etc/udev/rules.d/99-oracle-asmdevices.rules 是否还包含该节点私有设备规则(尤其是用 raw 设备的老环境)
  • /etc/hosts 里删掉该节点所有行(public、private、vip),否则新节点加入时可能因解析失败触发 CSS 心跳超时
  • 最隐蔽的是 GNS(Grid Naming Service)缓存:若用 GNS,需在剩余节点上执行 srvctl config gns 并确认 gnsctl listnode 不含已删节点

真正麻烦的从来不是脚本跑不跑得通,而是删完之后,OCR 里没它了,但 ASM 磁盘头里还记着它的 heartbeat,或者私网交换机上 ACL 还拦着它的 MAC 地址 —— 这些地方没日志、不报错,只让后续操作越来越慢、越来越随机失败。

text=ZqhQzanResources