---
title: "二次路由 - 数据库代理  V4.3.2 | OceanBase 文档中心"
description: 二次路由 当 ODP 首次转发请求至 OBServer 节点，OBServer 节点判断会生成远程计划时，会回包告诉 ODP 可以执行该语句的副本位置，ODP 则根据此次回包重新转发。当您的读写请求产生大量远程计划时，可以开启 ODP 的二次路由功能，其可以有效减少远程计划带来的网络开销。 您可通过配置 ODP 配置…
---
切换语言

- 中文站 - 简体中文
- 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/900.secondary-routing.md)  

当 ODP 首次转发请求至 OBServer 节点，OBServer 节点判断会生成远程计划时，会回包告诉 ODP 可以执行该语句的副本位置，ODP 则根据此次回包重新转发。当您的读写请求产生大量远程计划时，可以开启 ODP 的二次路由功能，其可以有效减少远程计划带来的网络开销。

您可通过配置 ODP 配置项 `ENABLE_REROUTE` 为 True 开启二次路由，命令如下：

```sql
ALTER PROXYCONFIG SET ENABLE_REROUTE = True;

```

#### 说明

仅 root@proxysys 账号和 root@sys 账号可执行 `ALTER PROXYCONFIG` 命令。

需要注意的是，仅以下场景支持二次路由。

- 事务首条语句
 - 分布式事务路由
 - 没有发生过二次路由
 - 非大请求，即请求长度不大于 ODP 配置项 `request_buffer_length`
 - 未指定 Primary Zone
 - 非指定 IP 路由
 - 关闭 Cached Server

## 示例

此处以对路由不准的请求进行二次路由为例。

1. 开启二次路由开关

   ```sql
   ALTER PROXYCONFIG SET proxy_primary_zone_name='';
   ALTER PROXYCONFIG SET enable_reroute = True;
   ALTER PROXYCONFIG SET enable_cached_server = False;

   ```
 2. 创建表，执行一条无法正确计算路由的语句，如下所示。

      - 创建表

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

       ```
      - 执行 SQL 语句

       ```sql
       obclient [test]> SELECT * FROM t_reroute WHERE C1=substr('abc',1,2);

       ```
 3. 通过诊断日志查看路由选取过程

   ```sql
   [2023-08-21 17:05:38.148301] [70901][Y0-00007F9A7B45A4E0] [ROUTE]((*route_diagnosis=
   Trans Current Query:"SELECT * FROM t_reroute WHERE C1=substr('abc',1,2)"

   Route Prompts
   > ROUTE_INFO
     [INFO] Will route to partition server or routed by route policy
   > PARTITION_ID_CALC_DONE
     [WARN] Fail to calculate first part idx

   Route Plan
   > SQL_PARSE:{cmd:"COM_QUERY", table:"t_reroute"}
   > ROUTE_INFO:{route_info_type:"USE_PARTITION_LOCATION_LOOKUP"}
   > LOCATION_CACHE_LOOKUP:{mode:"oceanbase"}
     > TABLE_ENTRY_LOOKUP_DONE:{table:"t_reroute", table_id:500030, partition_num:8, table_type:"USER TABLE", entry_from_remote:false}
     > PARTITION_ID_CALC_START:{}
       > EXPR_PARSE:{col_val:"C1=substr"}
       > RESOLVE_EXPR:{part_range:"[ab ; ab]"}
         > RESOLVE_TOKEN:{token_type:"TOKEN_FUNC", resolve:{"VARCHAR":"ab", collation:"utf8mb4_general_ci"}, token:"substr", expr_type:"OB_PROXY_EXPR_TYPE_FUNC_SUBSTR"}
       > CALC_PARTITION_ID:{error:-4226, part_description:"partition by hash(INT(binary)) partitions 8"}
     > PARTITION_ID_CALC_DONE:{error:-4226, partition_id:-1, level:1, partitions:"(p-1)"}
   > ROUTE_POLICY:{replica:"10.10.10.3:50111", idc_type:"SAME_IDC", zone_type:"ReadWrite", role:"FOLLOWER", type:"FULL", chosen_route_type:"ROUTE_TYPE_NONPARTITION_UNMERGE_LOCAL", route_policy:"MERGE_IDC_ORDER_OPTIMIZED", trans_consistency:"STRONG", session_consistency:"STRONG", proxy_idc_name:"zue"}
   > CONGESTION_CONTROL:{svr_addr:"10.10.10.3:50111"}
   > HANDLE_RESPONSE:{is_parititon_hit:"false", state:"CONNECTION_ALIVE"}
   > RETRY:{attempts:2, retry_status:"FOUND_EXISTING_ADDR", retry_type:"REROUTE", retry_addr:{10.10.10.2:50110}}
   > CONGESTION_CONTROL:{svr_addr:"10.10.10.2:50110"}
   > HANDLE_RESPONSE:{is_parititon_hit:"false", state:"CONNECTION_ALIVE"}
   )

   ```

   通过 `> RETRY:{attempts:2, retry_status:"FOUND_EXISTING_ADDR", retry_type:"REROUTE", retry_addr:{10.10.10.2:50110}}` 可以看到在计算路由失败，转发给 OBServer 节点生成远程计划后，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) 咨询热线
