srvctl modify nodeapps -n -a // 仅更新ocr记录,不自动同步os网络配置或listener.ora;若vip未绑定网卡、监听器未重载或arp响应异常,仍会报连接拒绝。
直接结论:srvctl modify nodeapps -n
srvctl modify nodeapps -A 修改后连接仍被拒绝的常见原因
很多人执行 srvctl modify nodeapps -n rac1 -A 172.16.90.169/255.255.255.0/eth0 后立刻测试 tnsping 或 sqlplus,结果还是 ORA-12541: TNS:no listener 或直接 TCP 连接超时。这不是命令没生效,而是它只完成了第一步——更新 OCR 中 VIP 资源定义。
- 操作系统层面:新 VIP 没在 eth0 上实际绑定(
ip addr show eth0看不到该地址) - 监听器配置:
$GRID_HOME/network/admin/listener.ora里LISTENER_SCAN1或LISTENER的 ADDRESS 仍指向旧 VIP,或漏掉新 VIP 的监听端口 - 防火墙拦截:新 VIP 所在子网未放行 1521 端口(尤其在云环境或安全加固过的物理机上)
- 客户端缓存:tnsnames.ora 或 JDBC URL 里写的还是旧 VIP,DNS 缓存未刷新(
nslookup rac1-vip验证解析是否更新)
必须同步执行的三步验证与补救
修改完 srvctl modify nodeapps 后,以下操作缺一不可:
- 手动绑定 VIP 到网卡:
sudo ip addr add 172.16.90.169/24 dev eth0;再用crsctl stat res -t | grep vip确认状态为 ONLINE,而非 INTERMEDIATE 或 OFFLINE - 检查并重载监听器:运行
lsnrctl status LISTENER,确认输出中包含新 VIP 的监听地址;若缺失,编辑listener.ora,在对应 LISTENER 的 DESCRIPTION_LIST 下补全新 VIP 的 ADDRESS 块,然后执行srvctl stop listener -n rac1 && srvctl start listener -n rac1 - 强制刷新 OCR 网络配置缓存:
srvctl stop nodeapps -n rac1 && srvctl start nodeapps -n rac1(注意不是 restart,stop+start 才会重新读取 OCR 并触发 VIP 绑定逻辑)
为什么不能只依赖 srvctl modify nodeapps?
Oracle 19c RAC 的 VIP 生命周期由三套独立机制控制:OCR 记录(srvctl 管)、OS 网络栈(ip addr 管)、监听器配置(listener.ora 管)。它们之间没有自动联动:
-
srvctl modify nodeapps只写 OCR,不调用ifconfig或ip命令 - Grid Infrastructure 启动 VIP 时,会读 OCR 获取地址,再调用系统命令绑定;但如果节点刚重启过、或 VIP 曾被手工删过,这个绑定动作可能跳过
-
listener.ora是静态文件,Grid 不会自动根据 OCR 更新它——哪怕你用srvctl config listener看到的输出是新的,那也只是“它声称监听”,实际监听行为仍取决于文件内容
最容易被忽略的验证点:VIP 是否响应 ARP 请求
即使 ping 通新 VIP,也不代表它能收连接请求。RAC VIP 必须响应同网段内其他主机发来的 ARP 请求,否则客户端根本发不出 SYN 包。
- 在客户端机器上执行:
arp -d 172.16.90.169 && ping -c 1 172.16.90.169 && arp -a | grep 172.16.90.169 - 如果 ARP 表里 MAC 地址为空或显示
incomplete,说明 VIP 所在节点没正确应答 ARP——大概率是网卡 down 了、防火墙 DROP 了 ARP、或/proc/sys/net/ipv4/conf/eth0/arp_ignore被设为 1(禁止响应非本机 IP 的 ARP) - 临时修复:
echo 0 | sudo tee /proc/sys/net/ipv4/conf/eth0/arp_ignore;永久修复需写入/etc/sysctl.conf











