load_balance=on必须置于description块内紧邻address才生效,否则tns解析器忽略;多address需用description_list包裹且每个description单独配置;仅配单scan地址时该参数无效。

LOAD_BALANCE=on位置错了,客户端根本没启用轮选
Java或SQL*Plus连RAC时全打第一个节点,不是Oracle不干活,是LOAD_BALANCE=on压根没被TNS解析器读到。这个参数必须放在DESCRIPTION块内、紧邻ADDRESS,不能塞进CONNECT_DATA,也不能挂在DESCRIPTION_LIST外层。
常见错误写法:(DESCRIPTION=(ADDRESS=...)(CONNECT_DATA=...)(LOAD_BALANCE=on)) → 不生效
正确写法(直连两个VIP):(DESCRIPTION_LIST=(DESCRIPTION=(ADDRESS=(HOST=rac1-vip))(LOAD_BALANCE=on)(CONNECT_DATA=(SERVICE_NAME=mydb)))(DESCRIPTION=(ADDRESS=(HOST=rac2-vip))(LOAD_BALANCE=on)(CONNECT_DATA=(SERVICE_NAME=mydb))))
- 只配SCAN地址(单个
HOST)时,LOAD_BALANCE=on无效——没得可选,TNS直接忽略 - JDBC URL里写
jdbc:oracle:thin:@(DESCRIPTION=...),整个括号就是TNS字符串,结构要求完全一样 - UCP、HikariCP等连接池启动时批量建连,若DNS缓存未刷新或SCAN返回IP顺序固定,所有连接会扎堆到同一节点
SCAN Listener没拿到实时负载数据
客户端随机挑了个地址发过去,最终落到哪个实例,由SCAN Listener决定。它靠什么判断?不是猜,是看每个实例通过PMON上报的V$SERVICEMETRIC.CURRENT_LOAD。没这数据,就只能round-robin或默认首节点。
检查是否生效:lsnrctl status LISTENER_SCAN1输出中,对应服务条目要有load=xx字段(如service_handler="DEDICATED", load=12),没有说明注册失败。
-
REMOTE_LISTENER必须指向SCAN地址(如scan.example.com:1521),不能是VIP、localhost或GNS VIP(若用GNS则必须是GNS VIP) - 改完
REMOTE_LISTENER后,立刻执行ALTER SYSTEM REGISTER;否则PMON可能延迟数分钟才推送新负载 - 确认服务已注册:
srvctl status service -d <db> -s <svc></svc></db>,再查v$services中LOAD_BALANCE列是否为YES
AWR里看不出负载不均,因为指标被平均掉了
AWR报告不提供“负载均衡度”百分比,单看CPU或会话数容易误判。真正要盯的是节点间协同开销——比如某个节点当“中转站”,自己没干多少活,却在大量收发gc cr block 2-way。
打开AWR报告 → 翻到“RAC Statistics”部分(不是“Instance Activity Stats”)→ 重点看每节点的:gc cr blocks received、gc current blocks received、gc cr blocks served、gc current blocks served。
- 接收多但服务少 → 它在“吃资源等别人送数据”
- 服务多但接收少 → 它在“扛主力被其他节点频繁请求”
- 查实时分布用
gv$sysstat,不是v$sysstat;漏加inst_id过滤会导致所有节点数据sum在一起,误判平稳 - 算标准差:4节点的
gc cr blocks received分别是100k / 95k / 110k / 20k,第4节点就是异常点,不是看平均值
Service级Load Balancing Goal对普通JDBC无效
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
ALTER SYSTEM REGISTER忘执行、或者查gv$sysstat时漏了inst_id。这些地方不细抠,光调参数没用。











