ADG本身不提供负载均衡能力,所谓“读写分离”仅指手动将只读请求路由至备库:需为备库显式注册独立SERVICE_NAME(如report),配置service_names并重启监听,客户端必须使用该服务名连接且设置只读语义(如JDBC设oracle.jdbc.readOnly=true),否则所有SELECT仍打向主库。
adg 本身不提供负载均衡能力,所谓“全球负载均衡”只是把只读请求手动路由到备库——配置错一步,所有 select 都打在主库上。
备库没 open read only 就别谈只读路由
物理备库不会自动打开,哪怕你买了 ADG 许可、启用了 MRP。ORA-16000 不是报错,是数据库在告诉你:“我开了,但只给你看”。
- 确认主库已启用
FORCE LOGGING:SELECT FORCE_LOGGING FROM V$DATABASE;返回YES - 确认备库处于
MOUNT状态且 MRP 正在运行:SELECT PROCESS, STATUS FROM V$MANAGED_STANDBY;中必须有MRP0行且STATUS = APPLYING_LOG - 显式执行:
ALTER DATABASE OPEN READ ONLY;—— 这步漏掉,TNS 再怎么配都连不到只读实例
客户端连的是 service_name,不是 db_name 或 instance_name
tnsnames.ora 里写 (SERVICE_NAME=orcl),哪怕连的是备库 IP,监听器也会按服务名查注册信息,最终路由回主库。
- 备库必须注册一个独立的只读服务,例如
report:srvctl add service -d orcl_standby -s report -r orcl_standby -P BASIC(RAC)或静态注册进listener.ora -
service_names参数需包含该服务名,且重启监听:lsnrctl reload后用lsnrctl status确认服务已上线 - 客户端连接串必须明确指向这个服务名,例如:
jdbc:oracle:thin:@//standby1:1521/report,不能复用主库的oltp或orcl
READ_ONLY_ROUTING_LIST 是监听器内部路由开关,不是客户端自动分流器
很多人在主库 listener.ora 里配了 READ_ONLY_ROUTING_LIST,就以为连主库监听器也能自动甩请求给备库——这是误解。它只在客户端声明“我要只读”时才生效。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 该参数仅影响 SCAN Listener 或 Local Listener 的路由决策逻辑
- 前提是客户端连接时已设置只读语义:JDBC 需
oracle.jdbc.readOnly=true,Pythonoracledb需connection.autocommit = True - SQL*Plus 默认不声明只读,
SET TRANSACTION READ ONLY在 ADG 备库上会直接触发ORA-01456 - 中间件如 ShardingSphere 若开启自动事务检测,会绕过只读路由,必须关闭或改用原生 JDBC 池
DG SWITCHOVER 后只读服务没漂移?检查 Management Policy
用 DGMGRL 执行 SWITCHOVER TO 后,原主库变备库,但之前注册的 report 服务可能还停在旧节点、没启动到新备库上。
- 查服务策略:
srvctl config service -d orcl_standby,确认Management Policy是AUTOMATIC - 手工添加的服务默认是
MANUAL,不会随角色切换自动启停,必须改为AUTOMATIC:srvctl modify service -d orcl_standby -s report -y AUTOMATIC - RAC 环境下还要确认 FAN 事件是否在备库监听中发布,否则连接池可能缓存失效节点
最常被忽略的一点:ADG 的“只读”是数据库层语义,不是网络层或代理层能力。所有路由控制点都在客户端连接参数、监听器配置和服务注册三者之间咬合,缺一不可。任何一层用错名称、漏设参数、或没 reload,都会让流量静默回到主库。


















