scan轮询异常主因是客户端未启用轮询逻辑:tnsnames.ora必须显式列出全部3个scan域名地址并置于同一address_list下,load_balance=on(小写),jdbc还需url中加loadbalance=true&failover=true且用ojdbc8+,dns须稳定返回3个独立a记录。

SCAN域名轮询异常,八成不是DNS没配好,而是客户端压根没走轮询逻辑——Oracle客户端不主动查DNS,你没手动写全3个地址,它就永远只连第一个。
tnsnames.ora里没写全3个SCAN地址
Oracle客户端不会自动把rac-scan.example.com解析出的3个IP补进连接列表,它只认你明文写的ADDRESS。漏写、少写、拆成多个DESCRIPTION,都会让LOAD_BALANCE=on失效。
-
ADDRESS_LIST必须包裹全部3个ADDRESS,不能写成3个独立的DESCRIPTION -
HOST字段填域名(如rac-scan1.example.com),不能填IP;该域名必须能被DNS解析出对应VIP,不能是CNAME别名 -
LOAD_BALANCE = on必须小写on,写成yes、true或ON均被静默忽略 - 示例结构:
(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应用没加loadBalance=true参数
Java应用光靠tnsnames.ora里的LOAD_BALANCE=on没用,JDBC Thin驱动默认不启用SCAN感知,必须在URL里显式声明。
- URL格式必须是
jdbc:oracle:thin:@(DESCRIPTION=...)开头,不能用@host:port/service简写 - 必须带
loadBalance=true&failover=true,且仅ojdbc8+支持 - 老版本驱动(如ojdbc6)即使写了参数也无效,会静默退化为单点连接
- DNS解析结果必须稳定返回3个IP,否则
loadBalance=true无意义
DNS返回结果不满足Oracle 19c硬校验
Oracle 19c启动SCAN监听器前会调用getaddrinfo(),要求DNS对同一查询返回≥2个独立IPv4 A记录。返回单IP、CNAME、或/etc/hosts里只写一行,都会导致SCAN监听器未绑定VIP。
-
dig rac-scan.example.com A +short连续执行10次,输出必须稳定为3行IP,且顺序明显变化 -
/etc/hosts里写多行同域名不同IP无效——glibc只取第一行,还可能报Unknown host - DNS服务器不能做视图隔离或ACL限制,客户端网段必须被允许查询全部A记录
- 某些DNS缓存服务(如dnsmasq)若启用了
addn-hosts,会优先返回/etc/hosts内容,破坏轮询
客户端SQLNET.ALLOWED_LOGON_VERSION_SERVER不兼容
Oracle 12c+默认SQLNET.ALLOWED_LOGON_VERSION_SERVER = 12a,老客户端(如Instant Client 11.2)连SCAN时会静默断连,现象是超时或ORA-12537。
- 检查客户端
sqlnet.ora中是否设置了SQLNET.ALLOWED_LOGON_VERSION_CLIENT,值应≥12a -
NAME.DIRECTORY_PATH必须包含TNSNAMES,且不能被EZCONNECT排在前面,否则跳过tnsnames解析 - 用
tnsping ORCL_SCAN验证是否真正走tnsnames路径,而非EZCONNECT回退
真正难排查的点不在DNS返回几个IP,而在于客户端是否“理解”自己正在连RAC——只要tnsnames.ora里少一个ADDRESS,或者JDBC URL缺一个=true,轮询就形同虚设。











