恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
Oracle 19c RAC集群节点重新添加全流程详解:从环境准备到实例验证
首页
资讯中心
/
Oracle 19c RAC集群节点重新添加全流程详解:从环境准备到实例验证
Oracle 19c RAC集群节点重新添加全流程详解:从环境准备到实例验证
发布时间:2026/9/16 21:58:29
1. 什么时候需要重新添加集群节点先说结论Oracle 19c RAC集群做节点重新添加基本就两种场景一是节点因为硬件故障、误删或者其他原因被踢出集群后运维要把这台机器重新纳入二是集群扩容往现有集群里增加一台新机器。标题里写的“重新添加”在实际运维中大多是第一种节点被删掉之后怎么把它干干净净地加回来。这个操作之所以值得单独写一篇是因为它和“从零搭建一套RAC”完全是两码事。新建RAC是穿新鞋走新路节点添加是在一个跑着的集群上动手术需要考虑现有集群配置、Grid Infrastructure版本、数据库实例状态、OCR和投票盘的一致性还有节点之间SSH互信、DNS解析、共享存储权限一堆细节。任何一个环节不对添加流程就可能卡住或者留下脏数据。我见过不少同行在节点被驱逐之后图省事直接跑addnode.sh结果因为残留的OLR信息、过期的hosts解析、不干净的/etc目录导致流程反复失败最后只能手工清注册表。这篇文章就是想把整个流程从准备到验证串一遍把我踩过的坑和常用的排查命令都写进去。适合正在做Oracle 19c RAC运维的DBA也适合刚接触集群、想搞清楚节点添加底层逻辑的人参考。2. 节点重新添加的前置检查与整体方案确认2.1 必须确认的硬件和集群环境信息在动手之前我建议先花半小时把集群的当前状态摸清楚。不要上来就执行安装RAC最怕的就是环境信息不清楚导致误操作。你至少要看这几样东西集群里现在有哪些节点状态都是online还是offline集群的Grid Infrastructure版本和补丁版本新节点的GI版本必须和现有节点一致不然crsctl命令都可能对不上数据库版本、是否RAC、有几个实例共享存储的ASM磁盘组状态预留的磁盘权限和属主OCR和投票盘的冗余方式正常情况至少有normal redundancy节点添加期间千万别出现只剩一个OCR或投票盘的情况操作系统版本、内核参数、依赖包列表新节点必须和现有节点保持同一套配置。这些信息可以通过下面一组命令快速获取# 查看集群所有节点和状态 crsctl status server -v # 查看集群版本和补丁 crsctl query crs activeversion $ORACLE_HOME/OPatch/opatch lsinventory # 查看数据库实例信息 srvctl config database -d orcl -v # 查看ASM磁盘组 asmcmd lsdg这些命令既能在旧节点上跑也能在准备加入的新节点上跑如果GI已经装了一半的话。我习惯先把这些输出保存下来后续做环境对比和故障排查都用得上。2.2 节点重新添加的整体方案设计节点重新添加本质上分三个阶段第一阶段是操作系统层面的准备让新节点具备加入集群的所有基础条件第二阶段是集群层面的添加让GI认识这个节点第三阶段是数据库实例层面的添加让RAC数据库在新节点上拉起一个实例。这里要强调一点OpenFiler、虚拟机快照或者物理机的RAID卡配置这类底层存储的事情这里不展开但共享存储这块必须提前确认。新节点上要能看到和现有节点完全一致的ASM磁盘磁盘的属主、权限、链路要一致。如果是多路径环境/etc/multipath.conf要配置一致udev规则也要一致。这在很多环境里反而是最容易出问题的环节。考虑到很多生产环境用的是Linux x86-64下文就以Linux平台为例。如果你用的是AIX或者Solaris命令细节会有差异但整体思路一致。我建议把整个添加过程写成一个checklist每完成一步就打一个勾。千万别一边聊着微信一边执行节点添加流程虽然不算特别长但中间有多个需要等待的环节一个分神就可能漏掉关键输出。3. 操作系统层面的准备3.1 主机名、网络配置和DNS解析新节点的主机名、IP地址、VIP地址、SCAN地址都需要提前规划好并且要和现有集群保持同一个子网或能互通的路由。主机名必须与/etc/hosts一致而且域名解析要能通过。Oracle Clusterware对主机名的解析非常敏感很多莫名其妙的添加失败都出在DNS解析上。举个例子如果你现有集群用的SCAN是scan-cluster.example.com解析出来三个VIP地址那么新节点的/etc/hosts或DNS里也要能解析SCAN而且解析结果必须和现有节点一致。不要小看这一点SCAN解析不一致会导致新节点的GI无法正常注册到集群后续跑root脚本的时候会直接报错。检查方式# 查看现有节点的hosts解析 cat /etc/hosts nslookup scan-cluster.example.com nslookup node1.example.com nslookup node1-vip.example.com # 新节点上也要做同样的解析检查 ping -c 2 scan-cluster.example.com主机名设置hostnamectl set-hostname rac3.example.com我遇到过一种情况新节点用hostnamectl设置了主机名但/etc/sysconfig/network里的HOSTNAME还是旧名字导致重启后主机名又变回去了。所以在Linux上设置主机名时/etc/hostname和/etc/sysconfig/network两个地方都要确认。3.2 操作系统用户、目录和权限准备Grid和Oracle软件运行依赖操作系统用户通常就是grid和oracle两个用户所属用户组也要和现有节点一致。可以用下面的方式快速对比# 在现有节点上查看用户和组 id grid id oracle cat /etc/group | grep -E oinstall|dba|asmadmin|asmdba|asmoper # 在新节点上创建相同用户如果没有的话 groupadd -g 1001 oinstall groupadd -g 1002 dba groupadd -g 1003 asmadmin groupadd -g 1004 asmdba groupadd -g 1005 asmoper useradd -u 1001 -g oinstall -G dba,asmadmin,asmdba,asmoper grid useradd -u 1002 -g oinstall -G dba,asmdba oracle用户ID和组ID最好保持和现有节点完全一致因为NFS或者共享文件系统上有些文件是按UID/GID授权的不一致会导致权限问题。Grid和Oracle的安装目录也要准备好mkdir -p /u01/app/19.0.0/grid mkdir -p /u01/app/oracle chown -R grid:oinstall /u01/app/19.0.0/grid chown -R oracle:oinstall /u01/app/oracle chmod -R 775 /u01/app这里的路径要和现有节点完全一致。路径不一致会导致后续运行时找不到资源脚本尤其是crsctl在添加节点时会读取大量文件路径不一致就是连环报错。3.3 依赖包和内核参数检查Oracle 19c对操作系统的依赖包和内核参数有明确要求。新节点上如果缺包GI的安装前检查会直接报错。我的经验是先手动把依赖包装齐不要等安装程序去检测因为Oracle的安装前检测有时候并不能找到所有缺失的包。以下是CentOS/RHEL 7/8上常见的一批依赖包yum install -y bc binutils compat-libcap1 compat-libstdc-33 \ gcc gcc-c glibc glibc-devel ksh libaio libaio-devel \ libX11 libXau libXi libXtst libXrender libXrender-devel \ libgcc libstdc libstdc-devel libxcb make net-tools \ nfs-utils python3 python3-configshell python3-rtslib \ python3-six smartmontools sysstat unixODBC unixODBC-devel内核参数也要对照现有节点逐一检查。比较关键的有这几个kernel.shmmax、kernel.shmall、fs.file-max、net.ipv4.ip_local_port_range、vm.max_map_count、fs.aio-max-nr。Oracle安装文档里有一个推荐值表但既然你是往已有集群里加节点最稳妥的方式是直接从现有节点复制一份配置过来。# 在现有节点上导出sysctl配置 sysctl -a | grep -E shmmax|shmall|file-max|ip_local_port_range|max_map_count|aio-max-nr # 在新节点上写入相同的配置 cat /etc/sysctl.conf EOF fs.aio-max-nr 1048576 fs.file-max 6815744 kernel.shmall 1073741824 kernel.shmmax 4398046511104 net.ipv4.ip_local_port_range 9000 65500 vm.max_map_count 262144 EOF sysctl -p还有/etc/security/limits.conf的配置也要保持一致cat /etc/security/limits.conf EOF grid soft nproc 2047 grid hard nproc 16384 grid soft nofile 1024 grid hard nofile 65536 grid soft stack 10240 grid hard stack 32768 oracle soft nproc 2047 oracle hard nproc 16384 oracle soft nofile 1024 oracle hard nofile 65536 oracle soft stack 10240 oracle hard stack 32768 EOF这里有个容易忽略的点如果你用的是Oracle Linux 8或者RHEL 8还需要确认systemd的userlimits有没有限制住光改limits.conf可能不够。可以检查/etc/systemd/logind.conf或直接在用户的service文件里加Limit配置。3.4 SSH互信配置集群节点之间通信依赖SSH互信。如果你是从零装GI安装程序会让你配互信但节点添加场景下需要手动把新节点和现有节点之间打通互信。Oracle 19c的互信可以用ssh userhost免密登录来验证。我建议用以下方式配置# 在grid用户下生成密钥新节点上 su - grid ssh-keygen -t rsa -b 4096 -N -f ~/.ssh/id_rsa # 把公钥分发到所有节点包括自己 ssh-copy-id gridrac1 ssh-copy-id gridrac2 ssh-copy-id gridrac3 # 验证互信 ssh gridrac1 date ssh gridrac2 date ssh gridrac3 date同理oracle用户也要配一遍。不要只配grid用户后续数据库实例的添加和运行同样需要oracle用户的互信。如果你是在一台现有节点上执行addnode.sh来添加新节点那现有节点和新节点之间的互信也必须要通因为安装程序会在节点间同步配置文件。4. 集群层面的节点添加4.1 从现有节点检查集群当前状态操作系统准备完成之后不要急着执行添加脚本。先在现有节点上把集群状态再确认一遍确保没有异常资源影响新节点注册。crsctl status server -v crsctl status resource -t crsctl check cluster -all正常情况下所有节点都应该是online状态没有被驱逐或者维护状态的节点。如果集群里有节点是offline先排查原因不要带着问题去加新节点。还有一个容易被忽略的点OCR的自动备份。添加节点过程中势必会修改OCR配置万一操作失败备份能帮我们回退。建议添加之前手动触发一次OCR备份ocrconfig -manualbackup ocrconfig -showbackup4.2 使用Oracle提供的添加节点工具Oracle 19c提供了两个层面的添加方式一个是用asmca或dbca的图形界面另一个是用静默模式的命令行工具。生产环境一般都用静默模式方便脚本化和审计。先说GI层面的添加。如果你已经下载了Grid Infrastructure的安装介质可以进入gridSetup.sh所在的目录执行$ORACLE_HOME/gridSetup.sh -addNode -silent -executePrereq-executePrereq会先做一次环境检查不实际执行这个参数我强烈建议先跑一遍。它能帮你快速定位新节点上缺失的依赖包、内核参数、用户权限等问题省得执行到一半才发现。检查通过后再正式执行$ORACLE_HOME/gridSetup.sh -addNode -silent \ -nodeList rac3.example.com \ -local注意-local参数的含义是只在本地节点执行通常从现有节点之一发起添加。如果你需要用静默模式同时添加多个节点可以把-nodeList写成逗号分隔的多个节点。执行过程会输出日志建议加上日志参数$ORACLE_HOME/gridSetup.sh -addNode -silent \ -nodeList rac3.example.com \ -local \ -logLevel finest日志文件的默认位置在Grid安装目录下的cfgtoollogs里格式类似于gridSetupActions*.log。如果执行失败先看这个日志。4.3 运行root脚本的关键时刻节点添加过程中最关键的步骤是安装程序要求你“在新节点上以root用户运行root.sh脚本”。这一步的作用是把GI的可执行文件复制到新节点更新OLROracle Local Registry并把新节点注册到集群。我见过很多失败案例都发生在这个阶段。原因主要有这几个root.sh运行前新节点的GI目录权限不对新节点上OLR信息残留或者OLR文件损坏/etc/oracle目录里的文件被锁定DNS解析不一致导致注册失败。运行root.sh之前我习惯先在新节点上清空可能的残留# 删除OLR相关文件仅在确认节点未注册的情况下 rm -f /u01/app/19.0.0/grid/cdata/*/*.olr rm -f /etc/oraInst.loc rm -rf /etc/oracle # 确保GI安装目录属主正确 chown -R grid:oinstall /u01/app/19.0.0/grid然后以root用户执行cd /u01/app/19.0.0/grid ./root.shroot.sh执行成功的标志是日志末尾出现类似CRS-2791: Starting shutdown of Oracle High Availability Services-managed resources、CRS-2673: Attempting to stop ora.crsd、CRS-2677: Stop of ora.crsd on rac3 succeeded这样的输出最后一行一般是“The Oracle Grid Infrastructure is successfully installed and configured”。如果root.sh失败千万不要重复执行多次先看日志。有些情况下需要手工清理后再跑有些情况下要回退节点添加。具体排查方法我放在后面专门写。4.4 使用crsctl确认新节点注册状态root.sh跑完之后回到现有节点上执行crsctl status server -v正常情况下应该能看到新节点变为online。如果状态是initializing或者offline说明GI虽然装了但未能成功注册到集群。也可以看集群资源状态crsctl status resource -t新节点的ora.rac3.vip资源应该也自动被添加并online。如果VIP资源没起来检查网络配置和VIP归属。另外OCR层面的信息也可以验证ocrdump -stdout | grep rac3这会输出包含rac3的所有OCR条目能直观看到新节点的注册情况。5. 数据库实例层面的添加5.1 检查数据库配置并添加实例GI层面搞定之后新节点还只是一个“空壳”RAC数据库并不会自动在新节点上创建实例。这一步需要单独操作。先用srvctl看一下当前数据库的配置srvctl config database -d orcl -v输出里会列出当前所有实例及所在节点。接下来要把新节点上的实例加进去。方法一使用dbca图形界面或静默模式。dbca -silent -addInstance \ -gdbName orcl \ -nodeList rac3.example.com \ -instanceName orcl3方法二有些版本也支持直接用srvctl修改配置但官方推荐的还是通过dbca来添加实例因为dbca会完成数据字典相关设置、创建spfile中的实例参数等动作。我一般在添加实例之前会先在新节点的GI资源层面确认ASM实例已经正常启动。如果ASM实例没起来dbca会直接报错crsctl status resource ora.asm -n rac3正常情况下ora.asm在rac3上应该是online状态。5.2 添加过程中需要注意的初始化参数dbca添加实例时会从现有实例复制参数。但有几个参数需要特别关注cluster_databaseRAC环境必须为TRUEdbca会自动处理instance_name新实例的实例名thread每个RAC实例使用独立的redo threaddbca会自动分配undo_tablespace每个实例需要独立的undo表空间dbca会自动创建local_listener和remote_listenerdbca会自动配置。这些参数会自动生成一般不用手工干预。但如果你发现新实例起不来检查一下remote_listener是否正确解析到SCAN地址。dbca执行成功的标志是输出“Database instance added”和一系列配置完成信息。之后用下列命令验证srvctl status database -d orcl srvctl status instance -d orcl -i orcl3如果实例状态是online说明大功告成。如果起不来去$ORACLE_BASE/diag/rdbms/orcl/orcl3/trace目录下看alert日志。5.3 验证实例运行与资源依赖在跑业务之前我习惯做一轮更全面的验证# 查看所有资源状态 crsctl status resource -t # 查看实例进程 ps -ef | grep smon | grep orcl3 # 登录数据库查看实例信息 sqlplus / as sysdba SQL select instance_name, status from gv$instance; # 查看服务是否正常注册到集群 srvctl config service -d orcl如果数据库配置了service也要确认service在新节点上是否可用已运行的service是否正常failover。6. 常见问题与排查技巧实录6.1 root.sh卡住或报错这是节点添加过程中最让人头疼的问题。root.sh卡住通常有几种表现日志一直刷重复信息、长时间停在某个资源操作上、或者直接报错退出。我的排查顺序是先看root.sh日志的末尾确认卡在哪个资源上如果是卡在某个OCR/VIP资源上把该资源的日志翻出来看$ORACLE_HOME/log/hostname/agent/crsd目录是重点如果是权限问题检查/u01/app目录下所有文件的属主和权限是不是有文件属于root或者错误用户如果是网络问题检查新节点和现有节点之间的端口连通性两个常见端口是1521监听和22SSH。遇到过一种情况是root.sh执行到一半新节点上的OLR文件没有权限导致crsctl命令根本无法读取本地注册表。这种时候把OLR文件删掉重跑root.sh往往能解决但前提是你确认这个节点不在任何实际资源里。6.2 DNS解析不一致导致添加失败如果你经常维护RAC一定会遇到这个问题。节点添加时SCAN解析不一致会导致GI无法确认集群拓扑直接报CRS-1028或CLSRSC-243。我的建议是在生产环境中SCAN和VIP的解析一定要用DNS不要只靠hosts文件。如果临时环境实在没有DNS确保所有节点的hosts文件内容完全一致尤其是SCAN的解析记录。# 在现有节点上检查SCAN配置 srvctl config scan srvctl config vip -n rac1新节点的解析结果要和这些输出保持一致。6.3 OCR权限和属主问题ASM磁盘和OCR磁盘的属主权限不一致会导致集群资源无法正常启动。比如你新节点上看到的/dev/asm-*设备属主不是grid:asmadmincrsctl在启动资源时就会报权限错误。处理方式也很直接——重新绑定udev规则或调整属主chown grid:asmadmin /dev/asm-* chmod 660 /dev/asm-*但更关键的是要确认新节点的ASM磁盘发现路径和现有节点完全一致。用asmcmd lsdsk -p比较一下两个节点看到的磁盘路径和ASM磁盘名不一致就用udev规则或者multipath配置去对齐。6.4 节点添加成功但实例一直启动失败这种情况常见于redo log或undo表空间的配置没有正确同步。dbca添加实例时自动创建的redo thread可能因为磁盘组空间不足而失败或者undo表空间创建失败导致实例无法在mount阶段找到undo段。排查方式先看新实例的alert日志定位是redo还是undo问题。如果是redo问题手工创建redo threadSQL ALTER DATABASE ADD LOGFILE THREAD 3 GROUP 31 (DATA) SIZE 512M; SQL ALTER DATABASE ENABLE PUBLIC THREAD 3;如果是undo问题手工创建undo表空间SQL CREATE UNDO TABLESPACE UNDOTBS3 DATAFILE DATA SIZE 8G;然后把对应的初始化参数指过去SQL ALTER SYSTEM SET UNDO_TABLESPACEUNDOTBS3 SCOPESPFILE SIDorcl3;重启实例生效。6.5 最容易忽略的几个坑总结一下我实践中最容易踩的坑新节点的/etc/oratab文件没有正确配置导致srvctl无法识别数据库homegrid用户和oracle用户的crontab里有旧任务干扰集群资源新节点的防火墙firewalld或iptables没有放行集群需要的端口SELinux没有设置为permissive或disabled新节点的时区timezone和现有节点不一致导致集群心跳超时新节点的/dev/shm过小影响共享内存。这些坑单个看起来都不大但组合在一起就是灾难。我在节点添加前有个习惯直接在现有节点上执行一遍cluvfy stage -pre nodeadd命令把新节点环境全部校验一遍它能检查的维度比手工检查全得多$ORACLE_HOME/bin/cluvfy stage -pre nodeadd -n rac3.example.com -fixup这条命令会输出一大堆检查项包括内核参数、依赖包、用户权限、网络配置、存储配置等。-fixup参数会自动修复部分问题但修复前会先要求你把结果人工确认一遍。就算不用-fixup它也能像体检报告一样告诉你哪里有风险。7. 验证结束后的收尾动作7.1 记录变更与更新运维文档节点添加完成之后别急着走人。第一时间把整个变更过程记录下来包括添加时间、操作人员、涉及的命令、新节点的配置信息、过程中遇到的问题和处理方式。这对后续排障非常有价值因为很多集群问题到最后都是“上次变更改了什么”导致的。更新运维文档时至少要把这些信息补进去节点主机名和IP、实例名、VIP地址、ASM磁盘组在新节点上的路径、GI和数据库补丁版本、SSH互信状态、备份策略覆盖情况。7.2 重新评估备份与监控体系节点变了备份策略也得跟着变。如果你的备份是基于RMAN的新节点加入后要确认备份通道是否能正常使用如果用了BACKUP AS BACKUPSET并且指定了通道数通道参数还是3个节点改成4个节点的配置。监控方面新节点要加入现有的监控体系包括主机资源监控、集群资源监控、数据库实例监控。如果用的是Zabbix、Prometheus或者Oracle Enterprise Manager记得重新部署agent或者重新导入目标。不要等到新节点出问题才发现监控里根本没有这台机器。我自己遇到过最尴尬的一次节点添加完成后业务方跟我说没问题结果一查EM发现新节点根本没有纳入监控然后那次正好赶上ASM磁盘组空间告警告警只发到了老节点新节点上的实例因为磁盘空间写满直接hang住我们是从应用报障才知道的。从那之后节点变更的收尾检查里永远有一条监控覆盖。7.3 观察期内的重点检查项节点添加完成后的24小时内我建议重点观察以下指标集群资源是否稳定有没有频繁的restart或者offline事件新节点上的alert日志有没有ORA-报错ASM实例的告警日志集群心跳网络是否有丢包新节点和现有节点之间的时间同步状态。如果有条件做一次实例failover测试把某个服务的首选实例切到新节点上再切回来验证业务在正常切换下没有问题srvctl relocate service -d orcl -s myservice -oldinst orcl1 -newinst orcl3这类变更测试尽量安排在生产业务低峰期测试完成后记得把配置恢复到正常状态。8. 写在最后的个人经验做了这些年RAC运维节点重新添加算是操作频率不高、但每次碰上都让人精神紧张的操作。它不像装一套新RAC那样从零开始反而更像是在一张已经画好的图上补一块缺失的拼图所有边界条件都必须严丝合缝。我最想分享的一点是不要怕用cluvfy、crsctl、ocrdump这些命令行工具去验证猜想也不要嫌日志长就跳过排查。几乎所有节点添加问题都能在日志里找到根因前提是你愿意一行一行看下去。还有一点是心态上的建议如果你在生产环境执行节点添加提前准备好回退方案比什么都重要。所谓回退方案就是如果添加失败你能不能在不影响业务的情况下把节点恢复原状。我一般的做法是添加前先做OCR备份同时保留好添加前的crsctl status输出这样就算流程走了一半失败也能通过比对状态、恢复备份把集群拉回可控状态。最后再给一个小技巧节点添加完成后把root.sh的执行输出重定向保存一份后续如果排查OLR或GI配置问题这份输出能帮你确认当时到底做了什么。我在多次故障复盘时都靠着这份日志还原了操作现场。希望这篇文章能帮你在处理Oracle 19c集群节点重新添加时少走一些弯路。如果在实际操作中遇到其他问题欢迎一起交流讨论。