---
title: "强制路由 - 数据库代理  V4.3.2 | OceanBase 文档中心"
description: 强制路由 强制路由是指用户无法控制的路由行为，由 ODP 决定是否强制路由。主要有以下情况： 非分布式事务路由，事务内语句强制路由至事务开启的 OBServer 节点 会话级临时表路由，对会话级临时表进行查询时，会强制路由至第一次查询临时表的 OBServer 节点 计算路由失败，且 enable_cached_se…
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*nSAhQbrBXKwAAAAAAAAAAAAADiGDAQ/original) 数据库代理 V 4.3.2

# 强制路由

更新时间：2026-04-14 17:41:09

[编辑](https://github.com/oceanbase/oceanbase-proxy-doc/edit/V4.3.2/zh-CN/600.data-routing/400.intra-tenant-routing/1000.force-routing.md)  

强制路由是指用户无法控制的路由行为，由 ODP 决定是否强制路由。主要有以下情况：

- 非分布式事务路由，事务内语句强制路由至事务开启的 OBServer 节点
 - 会话级临时表路由，对会话级临时表进行查询时，会强制路由至第一次查询临时表的 OBServer 节点
 - 计算路由失败，且 `enable_cached_server` 配置为 True，ODP 会强制路由到上一次会话所在的 OBServer 节点。
 - CURSOR/PIECES 路由，客户端使用 CURSOR/PIECES 流式获取/上传数据时，所有请求会强制路由至同一 OBServer 节点

强制路由所选取的 OBServer 节点为上一次建连的会话（use last server session）或者已经建连的会话（use cache server session）。

## 示例一：会话级临时表强制路由

本示例中以 Oracle 兼容模式为例。

1. 在某会话中创建临时表

   ```sql
   obclient [test]> CREATE GLOBAL TEMPORARY TABLE T0(C1 INT);

   ```
 2. 查询会话临时表

   ```sql
   obclient [test]> SELECT * FROM T0 WHERE C1=123456;

   ```
 3. 再次查询该会话临时表，使用 EXPLAIN ROUTE 命令查看路由选取过程

   ```sql
   obclient [test]> EXPLAIN ROUTE INSERT INTO T0 VALUES(1)\G

   ```

   输出如下，ODP 将查询语句路由到第一次收到查询会话临时表的 OBServer 节点。

   ```sql
   *************************** 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}

   ```

## 示例二：非分布式事务内语句强制路由

1. 关闭分布式事务路由

   ```sql
   ALTER PROXYCONFIG SET enable_transaction_internal_routing = false;

   ```

   #### 说明

   仅 root@proxysys 账号和 root@sys 账号可执行 `ALTER PROXYCONFIG` 命令。
 2. 创建表，开启普通事务

   ```sql
   obclient [test]> CREATE TABLE T0(C1 INT)  PARTITION BY HASH(C1) PARTITIONS 8;
   obclient [test]> BEGIN;
   obclient [test]> SELECT * FROM T0 WHERE C1=0;

   ```
 3. 使用 EXPLAIN ROUTE 命令查看路由选取过程

   ```sql
   obclient [test]> EXPLAIN ROUTE INSERT INTO T0 VALUES(4)\G

   ```

   输出如下，ODP 将后续事务内语句路由至开启普通事务的 OBServer 节点。

   ```sql
   *************************** 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

1. 配置开启缓存服务器，创建表

   ```sql
   ALTER PROXYCONFIG SET enable_cached_server = true;

   ```

   #### 说明

   仅 root@proxysys 账号和 root@sys 账号可执行 `ALTER PROXYCONFIG` 命令。
 2. 创建表

   ```sql
   obclient [test]> CREATE TABLE T0(C1 INT)  PARTITION BY HASH(C1) PARTITIONS 8;

   ```
 3. 执行一条无法计算路由的语句

   ```sql
   obclient [test]> SELECT * FROM T0 WHERE C1=SUBSTR(C1, 2);

   ```
 4. 使用 EXPLAIN ROUTE 命令查看路由选取过程

   ```sql
   obclient [test]> EXPLAIN ROUTE SELECT * FROM T0 WHERE C1=substr(C1, 2)\G

   ```

   输出如下，因为执行的语句无法路由，所以 ODP 将该语句路由至已建连的缓存的会话。

   ```sql
   -----------------
   > 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 获取缓存服务器进行路由。

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
