必须执行srvctl modify scan_listener -u命令,否则SCAN监听器仅绑定一个IP;Oracle 19c强制要求DNS返回≥2个独立IPv4 A记录,并通过getaddrinfo()校验,单IP或CNAME均导致静默失败。

srvctl modify scan_listener -u 这条命令漏掉,SCAN 就永远只绑一个 IP,无论 DNS 返回几个 A 记录。
SCAN 域名必须返回 ≥2 个独立 IPv4 A 记录
Oracle 19c Grid Infrastructure 启动时会调用 getaddrinfo() 校验 SCAN 域名解析结果,要求一次性返回至少两个 AF_INET 地址。只返回一个 IP(哪怕写三遍相同地址)会导致 srvctl start scan 静默失败,或 srvctl status scan_listener 显示监听器未绑定全部 VIP。
常见错误包括:
- DNS 配置了 CNAME → 19c 不递归解析,只认最终 A 记录
-
/etc/hosts写成10.10.10.25 10.10.10.26 10.10.10.27 rac-scan.example.com→getaddrinfo()只取第一个 -
/etc/nsswitch.conf中hosts: files dns且files在前 → 优先查/etc/hosts,绕过 DNS
验证方式(以 grid 用户执行):
dig rac-scan.example.com A +short
输出必须是三行独立 IPv4 地址(如 10.10.10.25、10.10.10.26、10.10.10.27);getaddrinfo -f rac-scan.example.com 必须显示至少两行 AF_INET 类型地址。
tnsnames.ora 必须显式列出全部 SCAN 地址 + LOAD_BALANCE=on
Oracle 客户端(含 JDBC Thin)**不会自动 DNS 轮询**,它只按你在 tnsnames.ora 里写的顺序连接。哪怕 DNS 返回 3 个 IP,如果你只写了一个 ADDRESS,连接就永远打到第一个节点。
正确结构必须满足三项:
-
ADDRESS_LIST包裹全部 3 个ADDRESS,不能拆成 3 个独立DESCRIPTION -
LOAD_BALANCE = on(小写on,写成yes、true或ON均被静默忽略) -
HOST字段填 DNS 可解析的 SCAN 域名(如rac-scan1.example.com),不能填 IP 或 VIP
示例:
(ORCL_SCAN = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = rac-scan1.example.com)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = rac-scan2.example.com)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = rac-scan3.example.com)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = orcl)) (LOAD_BALANCE = on) ) )
JDBC URL 必须带 loadBalance=true 且用 ojdbc8+
仅靠 tnsnames.ora 里的 LOAD_BALANCE = on 对 Java 应用无效。JDBC Thin 驱动只在 URL 匹配 @(DESCRIPTION= 模式时才触发 SCAN 解析逻辑,且必须显式启用负载均衡参数。
Spring Boot 的 spring.datasource.url 必须以 @(DESCRIPTION= 开头,例如:
jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=rac-scan.example.com)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCLCDB))(FAILOVER=on)(LOAD_BALANCE=on))
关键参数:
-
loadBalance=true(必须小写,loadbalance或LoadBalance无效) -
failover=true(建议开启,配合 SCAN 故障转移能力) - 驱动版本必须为
ojdbc8+,ojdbc7及更早版本不支持该特性
新增 SCAN IP 后必须执行 srvctl modify scan_listener -u
即使 DNS 已返回 3 个 IP,Grid 也不会自动创建对应数量的 LISTENER_SCAN2、LISTENER_SCAN3。不执行该命令会导致:
-
srvctl config scan_listener仍只显示LISTENER_SCAN1 -
srvctl status scan_listener只报告一个监听器运行,其余 SCAN VIP 无监听进程绑定 - 客户端连接可能成功,但负载无法分发到全部 SCAN IP
操作顺序严格为:
- 确认 DNS 已生效并被
getaddrinfo验证 srvctl stop scan_listener && srvctl stop scan-
srvctl modify scan -n rac-scan.example.com(强制刷新 SCAN 名称与网络映射) -
srvctl modify scan_listener -u(关键!生成新监听器资源) srvctl start scan && srvctl start scan_listener
这个 -u 参数是 19c 强制要求的刷新动作,不是可选项——它直接决定 SCAN 监听器是否能绑定全部 VIP。很多故障排查到最后,问题就卡在这一步没执行。


















