Oracle 19c RAC SCAN IP配置失败主因是getaddrinfo()校验未通过,要求SCAN域名必须解析出2–3个不同IPv4地址;DNS需返回3个独立A记录,/etc/hosts须分三行写不同IP,且须执行srvctl modify scan -u和srvctl modify scan_listener -u刷新OCR。

Oracle 19c RAC 安装时 SCAN IP 配置失败,八成不是 DNS 没配好,而是 Grid Infrastructure 启动阶段就卡在 getaddrinfo() 校验——它要求 SCAN 域名必须解析出 **2–3 个不同 IPv4 地址**,少于 2 个会静默失败或监听器不绑定 VIP。
SCAN 域名必须返回 2–3 个独立 IPv4 地址(不能是单 IP 或重复 IP)
19c 的 Grid 在 srvctl start scan 前强制调用 getaddrinfo(),只接受 ≥2 个 AF_INET 地址。常见错误包括:
- DNS 返回 1 个 A 记录 →
srvctl status scan_listener显示运行中,但ifconfig看不到 VIP 绑定 -
/etc/hosts写成10.10.10.25 rac-scan一行 → 无效;写三行相同 IP(如 25/25/25)→ 仍被当 1 个地址处理 - 用 CNAME 指向另一个域名 → 19c 不递归解析,只认最终 A 记录,若该记录只有 1 个 IP,照样失败
正确做法:
- DNS 方式(推荐):配置
rac-scan.example.com返回 3 行不同 IPv4(如10.10.10.25、10.10.10.26、10.10.10.27),用dig rac-scan.example.com A +short验证 -
/etc/hosts方式(仅限测试):每个节点都写 3 行,每行一个不同 IP + 相同域名,例如:10.10.10.25 rac-scan.example.com10.10.10.26 rac-scan.example.com10.10.10.27 rac-scan.example.com - 确保
/etc/nsswitch.conf中hosts:行含dns且files不在dns前面,否则仍走 hosts 优先导致校验失败
修改 SCAN IP 后必须执行 srvctl modify scan -u 和 srvctl modify scan_listener -u
OCR 不会自动同步新 SCAN IP,哪怕 DNS 已更新或 /etc/hosts 已改完。不刷新会导致 srvctl config scan 仍只显示旧 IP,新增 VIP 不生效。
- 先停服务:
srvctl stop scan_listener→srvctl stop scan - 再刷新 OCR:
srvctl modify scan -u(更新 SCAN VIP 列表)srvctl modify scan_listener -u(重建监听器资源,自动生成LISTENER_SCAN2、LISTENER_SCAN3) - 最后启动:
srvctl start scan→srvctl start scan_listener - 验证:
srvctl config scan应显示 3 行 SCAN VIP;srvctl status scan_listener应列出LISTENER_SCAN1/2/3全部运行
客户端连接 SCAN 必须显式写全 3 个地址 + LOAD_BALANCE = on
SCAN 域名本身不触发轮询。Oracle 客户端(包括 JDBC Thin)只按你写的顺序连第一个地址,除非你在连接描述符里手动列全 3 个 SCAN VIP 并启用负载均衡。
- tnsnames.ora 中必须这样写(注意大小写):
LOAD_BALANCE = on(小写on,写ON、true、yes全无效)
所有 ADDRESS 必须包在同一个ADDRESS_LIST下,HOST 填域名(非 IP),且该域名需能被客户端 DNS 解析出对应 VIP - JDBC URL 要加参数:
loadBalance=true&failover=true(仅 ojdbc8+ 支持) - 不要加
FAILOVER = on—— SCAN Listener 自身已具备故障转移能力,额外启用反而干扰分发逻辑
跨子网场景不能硬扩 SCAN1,必须用 SCAN2(12.1+ 才支持)
SCAN1 绑定的网络由 oifcfg getif 查出的 network1 决定,无法跨子网。想让 ADG 日志走独立网段(如 10.1.0.0/24),又不让生产流量混入,就得配 SCAN2。
- 先确认新网卡已识别:
oifcfg getif应包含该网卡且 role 是public或cluster_interconnect - 添加 network2:
srvctl add network -k 2 -S 10.1.0.0/255.255.255.0/eth1 -w static - 再加 SCAN2:
srvctl add scan -n scan-adg.example.com -k 2 - 别跳步骤:network2 必须先用
oifcfg setif声明,再srvctl add network注册进 CRS,否则报 “network does not exist”
SCAN 的核心不是“配几个 IP”,而是“Grid 能否在启动时拿到 ≥2 个可绑定的 IPv4 地址”,以及“客户端是否真正把这多个地址纳入连接路径”。漏掉任意一环,SCAN 就退化成单点直连。


















