Oracle 19c RAC负载均衡必须Client-side与Server-side协同生效:LOAD_BALANCE=on须置于每个DESCRIPTION内紧邻ADDRESS,多ADDRESS需用DESCRIPTION_LIST包裹并分别配置;Server-side依赖REMOTE_LISTENER指向SCAN地址且执行ALTER SYSTEM REGISTER使PMON上报V$SERVICEMETRIC.CURRENT_LOAD,缺一则连接全打首节点。

LOAD_BALANCE=on 放错位置,客户端根本没启用随机选地址
很多人在 tnsnames.ora 里写了 LOAD_BALANCE=on,但连接还是全打第一个节点——不是 Oracle 不干活,是这行参数压根没被 TNS 解析器读到。
- 必须放在
DESCRIPTION块内,紧邻ADDRESS,不能塞进CONNECT_DATA或DESCRIPTION_LIST外层 - 如果用了多个
ADDRESS(比如直连两个 VIP),必须用DESCRIPTION_LIST包裹,并且每个DESCRIPTION都要单独写一次LOAD_BALANCE=on - 只配 SCAN 地址(单个
HOST)时,LOAD_BALANCE=on无效——没得可选,TNS 直接忽略它 - Java 应用走 UCP 或 OJDBC,这个参数仍由本地 TNS 解析驱动读取;
jdbc:oracle:thin:@...URL 里加任何 LB 参数都白搭
Server-side 没注册负载,SCAN Listener 看不到各节点真实压力
客户端随机挑了个地址发过去,但最终落到哪个实例,由 SCAN Listener 决定。它靠什么判断?不是猜,是看每个实例通过 PMON 主动上报的 CURRENT_LOAD。没这数据,就只能 round-robin 或默认首节点。
-
REMOTE_LISTENER必须指向 SCAN 地址(如scan.example.com:1521),不是 VIP、localhost 或 GNS VIP(若用 GNS 则必须是 GNS VIP) - 改完参数后,立刻执行
ALTER SYSTEM REGISTER;—— 否则 PMON 可能延迟数分钟才推送新负载 - 检查是否生效:
lsnrctl status LISTENER_SCAN1输出中,对应服务条目要有load=xx字段(例如service_handler="DEDICATED", load=12),没有说明注册失败 - 确认服务已启动且注册:用
srvctl status service -d <db> -s <svc>,再查v$services中LOAD_BALANCE列是否为YES
Service 级 Load Balancing Goal 配了也白配,客户端根本不认
srvctl modify service -B SERVICE_TIME 这类命令看起来很专业,但对 sqlplus、tnsping、普通 JDBC 连接完全无效——它们不订阅 FAN 事件,压根不看这个配置。
- 只有启用了 FAN 的客户端才生效:UCP 连接池、WebLogic 数据源、或显式设置了
oracle.jdbc.fanEnabled=true的 OJDBC -
SERVICE_TIME和THROUGHPUT是两种目标类型,必须显式指定,不能留空;配错类型(比如该用THROUGHPUT却设成SERVICE_TIME)会导致策略不触发 - 服务创建时没带
-B参数,或修改后没重启服务,v$services里LOAD_BALANCE列会是NO - 客户端直连 VIP(绕过 SCAN),Server-side LB 完全失效——这种连接永远走不到服务路由逻辑
DNS 或网络层卡住,SCAN 根本没解析成功
SCAN 名字连不通,后面所有负载逻辑都是空谈。常见问题不在数据库配置,而在基础设施层。
- DNS 必须返回 3 个独立 A 记录(如
scan-rac.example.com → 192.168.10.101/102/103),不能只配 1 个,也不能用 CNAME - 防火墙必须放通 SCAN VIP 所在网段的 1521 端口,所有 RAC 节点 public 网卡需互通
-
srvctl status scan_listener是查 SCAN 监听状态的正确命令,lsnrctl status查的是本地监听器,容易误判 - ORA-12170 或反复超时,先 ping SCAN 名、telnet SCAN IP + port,排除 DNS 和网络问题再调数据库
LOAD_BALANCE=on 和 Server-side 的 REMOTE_LISTENER + ALTER SYSTEM REGISTER 必须同时到位,中间漏掉任意一环,连接就会沉默地堆在第一个节点上。最容易被跳过的,其实是那句手动执行的 ALTER SYSTEM REGISTER —— 它不报错,也不提示,但没它,SCAN 就永远看不到第二个节点的负载。


















