首批通过分布式安全可靠测评,为关键业务系统打造
强制路由
更新时间:2026-04-14 17:41:09
强制路由是指用户无法控制的路由行为,由 ODP 决定是否强制路由。主要有以下情况:
非分布式事务路由,事务内语句强制路由至事务开启的 OBServer 节点
会话级临时表路由,对会话级临时表进行查询时,会强制路由至第一次查询临时表的 OBServer 节点
计算路由失败,且
enable_cached_server配置为 True,ODP 会强制路由到上一次会话所在的 OBServer 节点。CURSOR/PIECES 路由,客户端使用 CURSOR/PIECES 流式获取/上传数据时,所有请求会强制路由至同一 OBServer 节点
强制路由所选取的 OBServer 节点为上一次建连的会话(use last server session)或者已经建连的会话(use cache server session)。
示例一:会话级临时表强制路由
本示例中以 Oracle 兼容模式为例。
在某会话中创建临时表
obclient [test]> CREATE GLOBAL TEMPORARY TABLE T0(C1 INT);查询会话临时表
obclient [test]> SELECT * FROM T0 WHERE C1=123456;再次查询该会话临时表,使用 EXPLAIN ROUTE 命令查看路由选取过程
obclient [test]> EXPLAIN ROUTE INSERT INTO T0 VALUES(1)\G输出如下,ODP 将查询语句路由到第一次收到查询会话临时表的 OBServer 节点。
*************************** 1. row *************************** Route Plan: Trans Current Query:"EXPLAIN ROUTE INSERT INTO T0 values(1)" Route Prompts ----------------- > ROUTE_INFO [INFO] Will route to last connected server [INFO] Query for session temporary table Route Plan ----------------- > SQL_PARSE:{cmd:"COM_QUERY", table:"T0"} > ROUTE_INFO:{route_info_type:"USE_LAST_SESSION", svr_addr:"10.10.10.3:50111", trans_specified:true}
示例二:非分布式事务内语句强制路由
关闭分布式事务路由
ALTER PROXYCONFIG SET enable_transaction_internal_routing = false;说明
仅 root@proxysys 账号和 root@sys 账号可执行
ALTER PROXYCONFIG命令。创建表,开启普通事务
obclient [test]> CREATE TABLE T0(C1 INT) PARTITION BY HASH(C1) PARTITIONS 8; obclient [test]> BEGIN; obclient [test]> SELECT * FROM T0 WHERE C1=0;使用 EXPLAIN ROUTE 命令查看路由选取过程
obclient [test]> EXPLAIN ROUTE INSERT INTO T0 VALUES(4)\G输出如下,ODP 将后续事务内语句路由至开启普通事务的 OBServer 节点。
*************************** 1. row *************************** Route Plan: Trans First Query:"SELECT * FROM T0 WHERE C1=0" Trans Current Query:"EXPLAIN ROUTE INSERT INTO T0 VALUES(4)" Route Prompts ----------------- > ROUTE_INFO [INFO] Will route to last connected server since current query in transaction Route Plan ----------------- > SQL_PARSE:{cmd:"COM_QUERY", table:"T0"} > ROUTE_INFO:{route_info_type:"USE_LAST_SESSION", svr_addr:"10.10.10.1:50109", in_transaction:true}
示例三:无法计算路由语句且 ODP 配置项 enable_cached_server 为 True
配置开启缓存服务器,创建表
ALTER PROXYCONFIG SET enable_cached_server = true;说明
仅 root@proxysys 账号和 root@sys 账号可执行
ALTER PROXYCONFIG命令。创建表
obclient [test]> CREATE TABLE T0(C1 INT) PARTITION BY HASH(C1) PARTITIONS 8;执行一条无法计算路由的语句
obclient [test]> SELECT * FROM T0 WHERE C1=SUBSTR(C1, 2);使用 EXPLAIN ROUTE 命令查看路由选取过程
obclient [test]> EXPLAIN ROUTE SELECT * FROM T0 WHERE C1=substr(C1, 2)\G输出如下,因为执行的语句无法路由,所以 ODP 将该语句路由至已建连的缓存的会话。
----------------- > ROUTE_INFO [INFO] Will route to partition server or routed by route policy > RESOLVE_TOKEN [WARN] Not support expr func(OB_PROXY_EXPR_TYPE_NONE) Route Plan ----------------- > SQL_PARSE:{cmd:"COM_QUERY", table:"T0"} > ROUTE_INFO:{route_info_type:"USE_PARTITION_LOCATION_LOOKUP"} > LOCATION_CACHE_LOOKUP:{mode:"oceanbase"} > TABLE_ENTRY_LOOKUP_DONE:{table:"T0", table_id:500006, partition_num:8, table_type:"USER TABLE", entry_from_remote:false} > PARTITION_ID_CALC_START:{} > EXPR_PARSE:{col_val:"C1=substr"} > RESOLVE_EXPR:{error:-4002, part_range:"(MIN ; MAX)always true"} > RESOLVE_TOKEN:{error:-4002, token_type:"TOKEN_FUNC", token:"substr"} > PARTITION_ID_CALC_DONE:{error:-4002, partition_id:-1, level:1, partitions:"(p-1)"} > ROUTE_INFO:{route_info_type:"USE_CACHED_SESSION", svr_addr:"10.10.10.2:50110"} > CONGESTION_CONTROL:{svr_addr:"10.10.10.2:50110"}根据
ROUTE_INFO:{route_info_type:"USE_CACHED_SESSION", svr_addr:"10.10.10.2:50110"}可以看出,路由失败后,ODP 获取缓存服务器进行路由。