oracle 19c rac强制要求scan域名解析出2–3个不同ipv4地址,单ip会导致srvctl start scan失败或scan listener未绑定全部vip;根本原因是grid启动时通过getaddrinfo()校验并要求≥2个af_inet地址,且/etc/hosts单行多ip无效,必须dns配置3个独立a记录或hosts中分三行写不同ip,并执行srvctl modify scan_listener -u刷新绑定。
oracle 19c rac 要求 scan 域名必须能解析出 1–3 个 ipv4 地址,只配 1 个 ip 在 dns 或 /etc/hosts 中会导致 srvctl start scan 失败或监听器注册异常——这不是可选限制,是 19c 的强制校验逻辑。
为什么单 SCAN IP 在 19c 会失败
19c 安装和启动阶段会主动验证 SCAN 域名的 DNS 解析结果(或 /etc/hosts 条目),若只返回一个 IPv4 地址,srvctl start scan 可能静默失败,或后续 srvctl status scan_listener 显示监听器未绑定全部 VIP。这是因为 SCAN Listener 设计上依赖多个 IP 实现负载分发与故障转移,单 IP 违反其运行前提。
- 错误现象常见于:
CRS-2672: Attempting to start 'ora.LISTENER_SCAN1.lsnr' on 'node1'后无后续,或srvctl config scan显示仅 1 个 SCAN VIP,但ifconfig确认该 IP 未实际绑定到网卡 - 根本原因不是权限或路径问题,而是 Grid Infrastructure 在启动 SCAN Listener 前做了
getaddrinfo()校验,且要求返回 ≥2 个AF_INET地址 - 即使你手动在
/etc/hosts写了 3 行相同域名 → 相同 IP,也无效;必须是 3 个**不同**的 IPv4 地址
DNS 方式:配置 SCAN 域名返回 3 个 A 记录
DNS 是 Oracle 官方唯一推荐的方式。关键不是“能不能配”,而是“怎么配才被 Grid 正确识别”:
- 确保 DNS 服务器响应中,
dig scan.example.com A +short或nslookup scan.example.com返回 3 行不同的 IPv4 地址(如10.10.10.25、10.10.10.26、10.10.10.27),顺序不重要 - 集群节点的
/etc/resolv.conf必须指向该 DNS;且/etc/nsswitch.conf中hosts:行必须包含dns,且不能把files放在dns前面(否则仍会优先查/etc/hosts) - 修改 DNS 后,无需重启任何服务,Grid 会在下次
srvctl start scan时自动拉取新记录;但建议执行systemctl restart nscd清除本地 DNS 缓存 - 不要用 CNAME 指向另一个带多 A 的域名——19c 不递归解析 CNAME,只认最终 A 记录
/etc/hosts 方式:强行支持多 IP 的唯一可行写法
虽然 Oracle 明确不推荐,但测试或封闭环境有时必须用 /etc/hosts。注意:以下写法仅在 19c 中有效,且需严格满足条件:
- 所有节点的
/etc/hosts必须完全一致,且每行只能有一个 IP + 域名,例如:10.10.10.25 scan.example.com 10.10.10.26 scan.example.com 10.10.10.27 scan.example.com
- 不能写成
10.10.10.25 10.10.10.26 10.10.10.27 scan.example.com(单行多 IP),glibc 的gethostbyname()不支持 - 必须确保
/etc/nsswitch.conf中hosts: files存在,且没有dns干扰(否则会跳过files) - 修改后执行
systemctl restart nscd或killall -USR2 nscd刷新缓存,否则srvctl仍读旧缓存
配置后必须执行的刷新动作
无论 DNS 还是 /etc/hosts 修改完成,都必须显式触发 SCAN Listener 重建绑定,否则新 IP 不生效:
- 先停服务:
srvctl stop scan_listener和srvctl stop scan - 再强制刷新监听器配置:
srvctl modify scan_listener -u—— 这步不可省略,它让 SCAN Listener 重新读取 DNS//etc/hosts并绑定全部 IP 到对应网卡 - 最后启动:
srvctl start scan和srvctl start scan_listener - 验证:
srvctl config scan应显示 3 个 SCAN VIP;ifconfig | grep -A1 "10.10.10.2[567]"应确认这些 IP 已绑定到对应网卡(如enp0s3)
最容易被忽略的是 srvctl modify scan_listener -u:它不改变 SCAN 名称或网络定义,只强制监听器重新加载地址列表。没这步,哪怕 DNS 已更新、/etc/hosts 已改好,SCAN Listener 仍只监听最初启动时发现的那一个 IP。











