在Oracle RAC集群里移除节点,不是把机器下架那么简单。OCR、节点应用、Inventory三处信息必须同步清理,否则集群中会留下陈旧条目,轻则影响后续扩容,重则导致CRS启动异常。常见做法是先在目标节点停止服务,再在保留节点上执行节点剔除,最后完成卸载与验证。以下内容以一个两节点RAC环境为例,假设保留节点为rac1,待删除节点为rac2,数据库名为orcl。

删除节点本质上需要完成四件事:停止并移除数据库实例、从OCR中删除节点注册、清理节点应用配置、卸载目标节点上的Oracle软件。整个过程涉及oracle和root两个操作系统用户,而且顺序不能乱。尤其是crsctl delete node这一步,必须等实例和节点应用停止后再执行,否则可能报资源占用错误。
一、删除节点前的准备与风险评估
任何变更操作都必须先评估风险。删除RAC节点会影响集群的高可用性,如果当前剩余节点负载已经较高,删节点后可能导致单点过载。因此,建议在业务低峰期操作,并提前确认剩余节点硬件资源足够承载全部负载。
操作前需要备份OCR和集群配置。可以使用ocrconfig -manualbackup或者自动备份,同时记录当前节点列表和网络配置。查看OCR备份命令为ocrconfig -showbackup,确认最近备份可用。还要检查数据库归档、监听、VIP等是否有绑定在待删除节点上的对象。
待删除节点上的数据库实例和节点应用必须彻底停止,包括VIP、监听、GSD、ONS等。某些版本中ASM实例也可能需要特殊处理。建议先通过srvctl status database -d orcl和crsctl stat res -t确认资源分布,避免误操作到保留节点。
二、执行节点删除的核心步骤
第一步是在待删除节点rac2上停止数据库实例和节点应用。使用oracle用户执行以下命令,确保目标实例没有活动会话后再停止。
# 在rac2上停止数据库实例 srvctl stop instance -d orcl -n rac2 # 停止节点应用(VIP、GSD、ONS等) srvctl stop nodeapps -n rac2
如果节点上配置了独立监听,也需要用lsnrctl stop或者netca删除监听。停止完成后,可以在保留节点上用crsctl stat res -t查看资源是否已经不在rac2上运行。
第二步是更新Oracle软件的节点列表。在保留节点rac1上以oracle用户运行OUI的updateNodeList命令,将集群节点列表改为只包含保留节点。这一步非常关键,因为Inventory中如果还记录rac2,后续打补丁或安装时会出现节点不一致错误。
# 在保留节点rac1上执行,更新节点列表
$ORACLE_HOME/oui/bin/runInstaller -updateNodeList ORACLE_HOME=$ORACLE_HOME "CLUSTER_NODES={rac1}" LOCAL_NODE=rac1
第三步是从OCR中删除节点。这一步需要root权限,在保留节点rac1上执行crsctl delete node命令。该命令会清理OCR中与rac2相关的条目,并更新集群配置。
# 以root用户在保留节点rac1上执行 crsctl delete node -n rac2
此命令通常需要几分钟,完成后可以检查返回信息确认节点已删除。如果报错提示节点仍在运行,说明前面停止服务的步骤没有执行完整。
第四步是移除节点应用。使用oracle用户在保留节点上执行srvctl remove nodeapps,将VIP、监听等注册信息从OCR中删除。有些版本还需要手动删除监听器和网络配置。
# 在保留节点rac1上执行 srvctl remove nodeapps -n rac2
第五步是卸载待删除节点上的Oracle软件。回到rac2,用Oracle Universal Installer的deinstall工具或者运行$ORACLE_HOME/deinstall/deinstall卸载数据库软件和Clusterware软件。卸载顺序建议先卸载数据库实例,再卸载Grid Infrastructure。对于19c及以上版本,可以使用gridSetup.sh的删除选项或者直接使用deinstall。
三、删除后的验证与常见问题处理
节点删除后,必须在保留节点上进行全面验证。首先查看集群资源状态,确认所有资源都只运行在保留节点上,不存在空跑或未知状态。
crsctl check cluster -all crsctl stat res -t srvctl config database -d orcl
如果crsctl stat res -t的输出中还有rac2相关条目,可能说明OCR清理不彻底。常见原因是没有按顺序执行crsctl delete node,或者srvctl remove nodeapps失败。此时可以尝试重新执行对应命令,并查看集群日志。
另一个常见问题是Inventory不一致。在保留节点上执行opatch lsinventory时,如果仍然看到rac2的组件信息,需要再次运行runInstaller -updateNodeList并指定正确的CLUSTER_NODES值。注意该命令必须在所有保留节点上分别执行,不能只在一台节点操作。
删除节点后,数据库初始化参数中与实例相关的配置也需要检查。比如cluster_database_instances参数可能包含已删除实例的数量,需要手动调整。可以通过show parameter cluster_database_instances查看并更新。此外,如果使用了Oracle RAC的service,需要确认service没有指向已删除节点。
最后,建议删除节点后重启一次保留节点的CRS,以验证集群能够正常启动。实际操作中遇到过删除节点后CRS无法正常启动的情况,多数是因为OCR中残留条目导致。如果遇到此类问题,可以使用ocrcheck检查OCR完整性,必要时从备份恢复。
Oracle RAC删除节点crsctl delete node修改时间:2026-09-29 15:16:20