Oracle 19c RAC节点重新添加全流程与故障排查实战

Oracle 19c RAC节点重新添加全流程与故障排查实战 1. 节点重新添加的适用场景与前置思路先说说什么情况下你会碰到“Oracle 19c 集群节点重新添加”这个操作。最常见的是这两种一是集群里某个节点因为硬件故障、系统崩溃或误操作导致GIGrid Infrastructure层面状态异常修复后需要让这个节点重新回到集群里正常工作二是节点系统重装、主机名或IP变更后原先注册在集群里的信息已经失效需要先清理掉旧的配置再以干净的状态把节点加回来。不管哪种场景核心诉求都是同一个让集群恢复到“所有节点都在线、数据库服务正常对外”的完整状态。很多人容易把“重新添加节点”和“新装一个集群节点”搞混实际上两者差距非常大。新装节点是从零开始直接在目标主机上执行gridSetup.sh选择“添加节点”即可而重新添加则往往伴随着旧节点残留信息的清理、CRS注册信息的修复、甚至是表决盘和OCR里脏数据的剔除。这一步要是没做干净后续添加十有八九会报错。还有一个常被忽略的点不要一上来就动手。在重新添加之前务必先搞清楚这个节点“为什么掉出去”。如果是因为网卡配置错了、私网不通、心跳超时被集群踢出去那你在修复配置前就重加结果一定是刚加进来又被踢出去来回折腾好几轮。我见过不少初级DBA在这个环节反复踩坑最后发现根因是交换机端口被禁用了。所以整个“节点重新添加”的链路我的建议是按这个顺序走先收集信息再清理环境然后添加节点最后做验证。信息没摸清之前不要碰任何命令。2. 环境检查与清理动手前必做的三件事2.1 检查原有集群的健康状态这个步骤看似多余实际上能省掉你后面大量排错时间。在目标节点上先用crsctl status resource -t看看集群层面还有没有这个节点的残留资源比如ora.node1.vip、ora.node1.LISTENER.lsnr这类资源是否还挂在集群里。同时用olsnodes -s检查各节点的状态如果目标节点显示的是Inactive或者干脆没显示那基本可以确认它已经不在集群配置里了。另外还要检查一下ASM实例和数据库实例的状态。原先这个节点上运行的实例是已经彻底停掉了还是处于abort状态如果数据库实例还在内存里挂着直接做节点添加可能导致ASM实例冲突或者数据库实例重复注册到集群里后面的问题会很麻烦。我习惯在操作前用一个脚本把当前集群状态完整导出来留档包括crsctl stat res -t的输出、olsnodes -n -v -p的输出、srvctl status database的输出这样不管操作过程中出了什么问题至少有一个基线可以对照。2.2 彻底清理解散后的节点残留如果这个节点之前是正常从集群里移除掉线的那情况会好很多因为crsctl delete node或DBCA卸载实例时已经清理了大部分信息。但如果是异常掉线比如节点直接失联、机器重装过系统那集群里的残留信息很可能五花八门。残留主要集中在几个地方CRS里的节点列表olsnodes还能看见它、OCR里注册的资源、GI的家目录GI_HOME里残留的配置文件、/etc/hosts和DNS里的记录、还有$ORACLE_HOME/network/admin/tnsnames.ora里的历史配置。清理的推荐路径是如果CRS还认识这个节点但状态异常先尝试把节点删除干净crsctl stop crs # 在目标节点上执行如果节点能起来 # 然后在正常节点上执行 crsctl delete node -force 节点名如果crsctl delete node报错或者节点在CRS里已经是完全消失的状态那就不需要这步了直接在目标节点上把GI_HOME和ORACLE_HOME底下的日志、监听文件、网络配置清理干净确保主机名和IP解析正常即可。这里有个坑要注意如果节点是重装过系统的那GI_HOME的inventory信息可能会与实际安装位置对不上导致后续执行添加节点脚本时报“路径已存在”或“inventory不一致”的错误。碰到这种情况建议把目标节点的/etc/oraInst.loc和$GI_HOME/inventory/ContentsXML/目录一并检查必要时手动修正或者删掉重建。2.3 核对网络与共享存储配置这一步决定了加完节点后集群是否稳定一定要认真核对。Oracle 19c RAC对网络的要求是至少两块网卡一块配public IP和业务网络互通一块配private IP节点间心跳通信两个网段绝对不能混。很多生产环境的故障都是因为管理员图省事把private IP和业务网段放在了一起结果心跳包和业务流量互相干扰集群频繁脑裂。检查网络时可以这样操作# 查看当前节点网卡信息 ip addr show # 检查私网网段的互通 ping -c 4 私网IP对端 # 检查心跳设备名确认没有启用了默认路由 route -n共享存储方面最简单的检查方式就是确认ASM磁盘组里的磁盘在目标节点上能看到且权限归属正确。Oracle 19c的ASM磁盘通常由grid用户和asmadmin组管理权限是crw-rw----所有者是grid:asmadmin。这个权限不对ASM实例起不来节点添加必然失败。另外还要检查一下设备持久化配置比如UDEV规则或者multipath配置文件确保每次重启之后/dev/oracleasm/disks/下面的设备名不会变。设备名变来变去是重加节点时最容易出问题的点之一。3. 节点添加实操全流程3.1 使用grid用户执行addNode前的关键参数准备工作完成后就可以开始正式的添加流程了。在目标节点上用grid用户登录找到GI_HOME目录下的gridSetup.sh执行添加节点。注意gridSetup.sh有两个模式可以加CRS集群节点也可以只加GI Home里的软件节点。我们这里显然是要加CRS集群节点所以会用到-addNode参数。一个完整的添加命令大致长这样cd $ORACLE_HOME ./gridSetup.sh -addNode -silent -ignorePrereq \ -newNodeName 节点名 \ 需要的话还可以指定private IP等参数实际生产环境我建议先跑一遍完整性检查prerequisite check用-silent加-ignorePrereq的话会把很多硬件和依赖检查都跳过虽然省时间但容易埋雷。更稳的做法是先用图形界面或gridSetup.sh -prereqOnly把预检跑一遍确认所有不通过项都能接受或者已经处理再真正执行添加。如果是通过图形界面操作流程就很直观启动gridSetup.sh后选择“Add Node”然后填要加的节点名和private、public IP系统会提示你输入其他节点的root密码然后自动把GI安装过去。整个过程中比较耗时的是软件复制的环节走网卡传输几百兆或几个G的文件快慢取决于网络环境。添加结束后脚本会提示你在目标节点执行root脚本类似/tmp/xxx/discSetup.sh 或 $ORACLE_HOME/root.sh这个root脚本是必须执行的它负责完成权限调整、注册CRS服务、启动OHASD等关键动作。很多人容易漏掉这一步或者忘了以root身份执行结果CRS服务根本起不来。3.2 使用dbca向集群数据库添加实例GI层面添加完节点后集群数据库还不会自动在新节点上跑起来。你还需要用DBCADatabase Configuration Assistant给目标数据库添加实例。确认一下还有哪些数据库实例需要添加srvctl config database # 查看数据库的整体配置 srvctl status database # 查看实例在线情况如果新节点还没有任何实例执行dbca -silent -addInstance \ -nodeList 新节点名 \ -gdbName 数据库名 \ -instanceName 实例名前缀 \ -sysDBAUserName sys \ -sysDBAPassword 密码这一步要注意的是实例名的命名规则通常是在全局库名基础上加一个数字后缀比如oradb1、oradb2要确保和已有实例不冲突。DBCA往新节点添加实例的同时还会自动完成redo log group、undo tablespace的调整以及将新节点的listener注册到集群监听服务里所以不需要手动创建这些对象。如果数据库启用了PDB那实例添加完成后PDB会在新实例上自动打开取决于容器数据库的配置。如果不希望PDB在新实例上自动打开可以在DBCA执行前先修改容器的open_mode或者通过srvctl控制数据库在指定节点上的启动策略。3.3 使用asmca检查ASM磁盘组与表决盘状态最后一步就是验证ASM层面是否正常。新节点上ASM实例通常会在GI启动时自动拉起来但磁盘组里的磁盘是否能被新节点看到、表决盘voting file是否能正常读写都需要检查。可以用asmcmd检查# 查看磁盘组与磁盘状态 asmcmd lsdg asmcmd lsdsk -k # 确认ASM实例状态 srvctl status asm -node 新节点名如果发现磁盘组在新节点上是MOUNTED状态但某些磁盘的状态是OFFLINE或者UNKNOWN那大概率是权限或设备名问题回到第2.3节再排查一遍。表决盘的检查方式crsctl query css votedisk如果输出里显示的磁盘号和正常节点不完全一致可以用crsctl add css votedisk 磁盘路径 crsctl delete css votedisk 无效磁盘路径来修正表决盘列表。这一步一旦做错可能会影响整个集群的仲裁能力操作前一定慎之又慎最好在变更窗口做并保留原有crsctl query css votedisk的输出作为回滚依据。4. 常见问题与排查实录4.1 预检不通过缺少必需的依赖包或内核参数值不满足在添加节点时,预检经常因为缺少依赖包被卡住。Oracle 19c尤其是对compat-libstdc、oracle-database-preinstall-19c这类包很严格。另外内核参数也是高频问题比如vm.swappiness、kernel.shmmax、fs.file-max、kernel.sem这些值如果不满足要求预检一样会报红。处理方式不是无脑把预检-ignorePrereq掉正确的做法是先看完整预检报告判断哪些项只是warning哪些是error。warning级别可以接受error级别必须先处理完再继续。比如内核参数可以直接修改/etc/sysctl.conf后执行sysctl -p刷新缺包就用系统的包管理器安装。注意如果你是在麒麟操作系统、统信UOS这类国产化系统上部署Oracle 19c预检报错会更多一些因为Oracle官方对国产系统的认证和依赖包覆盖不如海外主流发行版那么完善。这种情况下要逐项分析报错原因必要时手动创建oracle用户和oinstall、dba用户组手动设置环境变量才能跳过预检继续安装。4.2crsctl delete node -force报错或添加时提示OCR里已有节点记录这种情况很典型特别是节点异常掉线后CRS里残留的内容会导致新添加节点的报错。报错一般类似“PRCN-2018The specified node(s) are not a part of the cluster”或“PRCR-1017The node is not known”。我的处理经验是如果delete node清不干净可以用crsctl add node -force或者手工操作OCR把旧的节点记录删掉。具体命令# 查看集群节点列表确认残留节点 olsnodes -n -s # 手工从OCR里移除旧节点名称 crsctl delete res 资源名 -force不过手工删OCR里的资源风险很高非必要不要碰更不建议在没有备份的情况下动OCR。更稳妥的做法是把目标节点彻底清理干净卸载GI、删掉inventory、清空OCR里对应的节点条目重新从正常的集群节点发起添加。如果你的集群本来就只有两个节点删掉一个之后只剩一个那还要注意仲裁问题——单节点集群添加新节点和双节点集群添加是完全不同的流程。4.3 数据库实例在新节点上启动失败报ORA-00304或ORA-01157这两个错误经常相伴出现原因是控制文件和数据库文件读取异常。最常见的原因是新节点访问共享存储的时候设备权限不对或者因为ASM磁盘组在目标节点上的mount顺序不对导致无法正常读库文件。先检查ASM的告警日志tail -200 $ORACLE_HOME/rdbms/log/节点名_ORA_进程号.log # 或者直接看ASM实例的告警日志 tail -100 $GI_HOME/rdbms/log/ASM_asm_节点名.log日志里如果明确写着ORA-01157: cannot identify/lock data file那就可以聚焦在ASM磁盘可见性和权限上。确认磁盘组状态正常后再尝试手工把实例从无状态改成开启srvctl start instance -db 数据库名 -instance 实例名 -starttype open如果一次起不来不要反复试先把ASM层面的问题解决掉再启动数据库实例否则重复尝试可能引发更多的hang住和锁问题。4.4 节点添加完成后私网心跳时通时断集群频繁报脑裂这个问题的成因往往不在Oracle层面而在网络侧。心跳走的是专用私有网段交换机上如果portchannel配置错误、允许VLAN不对、或者网线接触不良都会造成心跳包延迟变大或丢包触发CSS层面的超时判定。排查方式# 在目标节点上观察私网网卡的错误计数 netstat -in # 持续ping对端私网IP观察丢包 ping -c 100 -i 0.2 对端私网IP # 检查集群日志里是否有明显的IPC timeout tail -200 $GI_HOME/log/节点名/cssd/ocssd.log如果是丢包严重第一件事不是调Oracle参数而是找网络团队修链路。把交换机端口、网线、光纤模块逐一排查。有时候只是节点重启后网卡没有正确UP执行ifconfig 网卡名 up就能解决。如果链路正常但心跳依然报超时再考虑调整misscount和reboottime参数。但这两个参数一定要谨慎动调大了会延长脑裂检测时间调小了会导致误杀正常节点。一般情况下保持默认值就好确需调整时先和原厂支持确认。4.5 图形界面无法启动报DISPLAY或X11转发错误如果你是通过远程图形界面做节点添加的经常会碰到DISPLAY环境变量没设置好或者X11转发权限不足的问题。解决方式很简单用Xshell、MobaXterm这类支持X11转发的客户端登录前开启X11转发登录后检查echo $DISPLAY是否正常。如果是无桌面的服务器环境那建议果断走命令行silent模式不要和图形界面死磕。逐项准备应答文件里的参数执行一次addNode即可。silent模式虽然看不到进度但可以通过日志跟踪进度tail -f $ORACLE_HOME/cfgtoollogs/cfgTool/目录下的日志文件5. 节点添加完成后的完整验证清单5.1 集群资源和监听、VIP是否都正常接管节点添加完成后不能只看crsctl stat res -t里节点状态是ONLINE就完了。重点还要确认VIP、LISTENER、SCAN、ONS这些依赖网络的资源在新节点上是否都处于在线状态。很多时候节点能加进来但VIP因为IP被占或子网掩码不对起不来然后业务连接就会受影响。验证命令# 确认所有集群服务的总体状态 crsctl stat res -t # 查看监听状态 lsnrctl status 监听名 # 验证VIP能否ping通 ping -c 3 新节点的VIP地址如果VIP起不来多半是public IP的子网掩码或网关配错了。检查ifconfig里的掩码是否和规划一致同时确认/etc/hosts里的VIP解析指向正确的IP。再补充一个常见问题有些环境配置了SCAN IP节点添加后如果SCAN监听没有在新节点上起来应用连接串可能还是能通过其他节点的SCAN监听工作但会导致连接分布不均。可以用nslookup SCAN域名或srvctl config scan确认SCAN的每个IP都正常。5.2 数据库实例、PDB和服务的在线情况数据库层面要验证的不光是实例能启动还包括实例的服务注册、PDB的open状态、以及负载均衡策略是否符合预期。验证命令# 查看数据库所有实例的状态 srvctl status database -db 数据库名 -v # 查看具体的服务状态 srvctl status service -db 数据库名 # 如果数据库是CDB架构还需要查看PDB状态 sqlplus -s / as sysdba show pdbs;如果PDB在新节点上没有自动打开可以用alter pluggable database all open;然后确认新实例的联机日志、Undo表空间是否都正常建立。DBCA在添加实例时会自动创建一套新的redo日志组和undo表空间但如果平时做过手动扩展建议顺带检查一下这些表空间在目标节点上的配置是否一致避免某个实例的undo空间明显偏小、业务高峰期报ORA-01555或ORA-30036。5.3 备份OCR、备份惊喜包、恢复演练建议所有节点都恢复正常后千万别忘了备份OCROracle Cluster Registry。OCR是集群的“大脑”里面记录了所有资源、节点、ASM实例、数据库实例等关键配置OCR一旦损坏整个集群都可能起不来。备份命令crsctl backup ocr /tmp/ocr_backup_日期.bak # 查看当前OCR备份策略 crsctl query ocr backup另外还建议把ASM的参数文件、监听配置文件、tnsnames.ora这些关键配置文件做一个快照归档。将来如果还需要类似操作直接可以从这套干净的基线重新开始。最后再分享一个习惯每次做完节点变更我都会在维护文档里记录三个时间线——变更前集群状态、变更中遇到的问题、变更后验证结果。看似多花十几分钟但下次出问题排查时这份记录能帮你节省几个小时。6. 补充常见报错速查表顺手整理一份我折腾Oracle 19c集群节点重新添加时遇到的报错和对应处置办法都是实际碰过的故障直接照着排查会比较快。报错信息常见原因处理方式PRCN-2018节点不在集群配置中节点已被强制删除或从未加入使用图形界面重新执行添加节点先确认旧节点记录已清除PRCR-1017节点不可知OCR中节点记录损坏或残留检查olsnodes -n -v输出确认节点名、IP准确无误CRS-5017资源ora.xxx.vip无法启动公共IP被占用或子网掩码错误检查IP占用情况核对主机名解析和网卡子网规划ORA-00304无法读取控制文件ASM磁盘权限或mount顺序异常检查ASM实例状态核实磁盘组权限和asm_diskstring配置ORA-01157无法标识或锁定数据文件设备名漂移或磁盘离线检查UDEV/multipath配置确保设备名固定重新挂载磁盘组INS-20802集群验证失败依赖包缺失或内核参数不满足安装oracle-database-preinstall-19c手工修正sysctl.confCRS-1006私网心跳超时触发脑裂网卡故障或私网链路问题检查netstat -in丢包排查交换机端口、网线必要时调整misscountCSSD-6016检测到网络路由失败私网配置了默认路由或路由冲突检查route -n确认私网网卡没有默认路由必要时永久删除冲突路由EVMD-0045事件日志无法获取操作系统时间不同步启用NTP或chrony同步确保各节点时间差在合理范围内ORA-15032ORA-15075ASM磁盘无法mountASM磁盘组已经由其他节点以不同方式挂载确认集群状态一致后用asmcmd检查磁盘组归属状态这张表如果在操作时能帮上一点忙那这篇文章的目的就算达到了。7. 动手前最后的三个提醒如果你和我一样经历过凌晨接到告警电话、赶去机房处理集群节点失联的场面那你一定明白Oracle 19c集群节点重新添加这类操作真正的难点从来不是照着文档执行命令而是周边环境的完整排查和风险的预先控制。第一个提醒不要只盯着Oracle层面。节点加不进去、加进去又掉出来头号嫌疑往往是操作系统层面的问题比如防火墙把私网端口封了、SELinux没有关闭、/etc/hosts配置错误、系统时间不同步。这些基础项没搞定Oracle姿势再正确也白搭。第二个提醒尽量在维护窗口内做完整流程演练。生产环境没条件演练的话至少在一套测试环境把流程跑通一遍。我自己就在一次升级操作前先在测试环境把两个节点重新添加跑了两遍第二遍才注意到私网网卡的MTU设置和交换机不一致预检能过但心跳就是不稳定。这种问题不在测试环境先暴露出来到了生产环境就非常被动。第三个提醒也是最重要的不要为省事跳过验证。官方文档里通常只写到“添加节点完成”但实际工作中节点加完只是开始OCR备份、监听验证、VIP验证、PDB验证、以及应用连接测试一个都不能省。有次客户以为节点加完就万事大吉结果第二天业务方反馈部分连接失败一查发现新节点的listener只注册了主机名服务SCAN监听没有正常接管折腾了一圈才解决。节点的重新添加说到底是一次对集群自愈能力的体检。把每一步都走稳你收获的不仅是一个恢复正常的节点还有对整个RAC架构更深一层的感觉。实操中碰到任何奇怪报错先深呼吸回到基础项目逐项核对大部分问题都离不开IP、共享存储、权限这“老三样”。希望这篇记录能让你少走几个弯路。