addnode.sh执行失败主因是网络与权限未对齐:需验证SSH免密、/etc/hosts双向解析、GI用户一致性;CRS启动失败多因OCR/Voting磁盘权限或路径问题;实例未注册需手动srvctl add/start;连接ORA-12514系监听缺静态注册。
addnode.sh 执行失败:ORA-12547、TNS-12537 或 “no response from node”
这是最常卡住的地方,不是脚本本身出错,而是底层网络和权限没对齐。rac 节点加之前,addnode.sh 会尝试用 ssh 免密从当前节点拉起远程节点的 oraagent 和监听,任何一环断开都会静默失败。
实操建议:
- 手动验证 SSH 免密:在所有已有节点上执行
ssh -o ConnectTimeout=5 -o BatchMode=yes racnode2 date(把racnode2换成目标节点名),必须返回时间且无密码提示;BatchMode=yes是关键,否则交互式提示会卡死脚本 - 检查
/etc/hosts是否双向解析:目标节点的 public IP、VIP、SCAN IP 都得能被所有现有节点nslookup或ping通,且反向解析(PTR)也必须匹配主机名,Oracle 12c+ 默认校验这个 - 确认 GI 安装用户(如
grid)在新节点上已存在、UID/GID 与原集群一致,且~grid/.bash_profile中未意外加载 Oracle RDBMS 环境变量(比如ORACLE_HOME指向数据库家目录)
runInstaller -executeConfigTools 时卡在 “Starting Oracle Clusterware stack on node”
这说明 CRS 进程在新节点启不起来,常见于 OCR/Voting Disk 路径不可达或权限不对。Oracle 不会在日志里直接说“你没挂盘”,而是反复重试后超时。
实操建议:
- 登录新节点,手动运行
crsctl check crs,如果报CRS-4639: Could not contact Oracle High Availability Services,立刻查crsctl start crs -wait输出,重点看 OCR 设备是否Permission denied - 确认 ASM 磁盘组(如
+OCR)在新节点上能被asmcmd lsdg列出;若不能,检查 udev 规则是否同步、oracleasm scandisks是否执行、/dev/oracleasm/disks/下符号链接是否指向正确的底层设备(如/dev/sdb1) - 不要跳过
root.sh手动执行:在新节点跑完addnode.sh后,必须切到root用户执行/u01/app/19.0.0/grid/root.sh(路径以你的 GI 安装路径为准),它会配置 ocrconfig、启动 ohasd,漏掉就永远起不来
实例未自动注册到集群:srvctl add database / add instance 没生效
addnode.sh 只管 GI 层,数据库实例扩展是独立步骤。很多人以为脚本跑完实例就自动上线,结果 crsctl stat res -t 里根本看不到 ora.dbname.db。
实操建议:
- 先确认数据库软件已安装到新节点:用
scp或共享 NFS 把$ORACLE_HOME完整拷过去(含rdbms/lib/libclntsh.so等),别只复制二进制;然后在新节点执行runInstaller -ignoreSysPrereqs -executeConfigTools -responseFile /path/to/response.rsp - 用
srvctl add instance -d dbname -i dbname2 -n racnode2注册实例,注意-i参数必须是完整实例名(如orcl2),不是 SID;注册后立刻srvctl start instance -d dbname -i dbname2,别等自动拉起 - 检查监听是否绑定正确:新节点上的
lsnrctl status应显示LISTENER_SCAN1和LISTENER都在运行,且tnsping dbname能解析到所有节点的 SCAN 地址;否则修改$ORACLE_HOME/network/admin/listener.ora,确保HOST值是本机 public 主机名,不是localhost
扩展后连接失败:客户端连 SCAN 时轮询到新节点但报 ORA-12514
这不是网络问题,是新节点监听没加载数据库服务名。SCAN VIP 解析到了新节点,但它的本地监听不知道这个数据库该往哪转,于是拒绝连接。
实操建议:
- 在新节点上检查
lsnrctl services输出,确认里面有类似Service "dbname" has 1 instance(s)的条目;如果没有,说明静态注册没生效,需要在listener.ora中显式加SID_LIST_LISTENER段,包含(SID_DESC=(SID_NAME=dbname2)(ORACLE_HOME=/u01/app/oracle/product/19c/dbhome_1)) - 别依赖动态注册:RAC 实例启动后默认向本地监听动态注册,但若监听启动早于实例(比如机器重启后),可能错过注册时机;静态注册是保底手段,尤其在节点刚加入时
- 验证方式最简单:在新节点上用
sqlplus / as sysdba登录后执行select instance_name, host_name from v$instance;,确认输出是dbname2和本机名;再从客户端tnsping dbname,看到三次成功响应(对应三个 SCAN VIP)才算真正闭环
整个流程里最容易被跳过的其实是新节点上 root.sh 的执行和监听的静态注册——前者让集群感知节点,后者让连接找到实例。这两个动作不完成,前面所有步骤都等于只铺了半条路。










