---
title: "Transfer Partition - OceanBase 数据库 V4.6.0 | OceanBase 文档中心"
description: Transfer Partition 当自动的负载均衡无法满足用户对于特定分区的聚合和打散需求时，可以手动发起 Transfer Partition 操作。 使用限制及注意事项 执行 Transfer Partition 操作的用户需要拥有 ALTER SYSTEM 权限。有关权限的详细介绍，请参见 用户和权限概述 …
---
切换语言

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

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 4.6.0

# Transfer Partition

更新时间：2026-05-25 12:32:51

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.6.0/zh-CN/600.manage/350.load-balancing-manage/200.transfer-partition-management.md)  

当自动的负载均衡无法满足用户对于特定分区的聚合和打散需求时，可以手动发起 Transfer Partition 操作。

## 使用限制及注意事项

- 执行 Transfer Partition 操作的用户需要拥有 `ALTER SYSTEM` 权限。有关权限的详细介绍，请参见 [用户和权限概述](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005682875)。
 - 仅支持在主租户上执行 Transfer Partition 操作，并且只能 Transfer 用户租户下的分区。
 - 关闭租户的 Transfer 功能（即租户下配置项 `enable_transfer` 的值为 `false`）后，对该租户执行 `TRANSFER PARTITION` 语句会报错，已经执行成功了的 `TRANSFER PARTITION` 语句，其对应的 Transfer Partition 任务可能会被取消。
 - 不支持对系统表执行 Transfer Partition 操作。
 - 不支持对系统租户下的用户表执行 Transfer Partition 操作。
 - 不支持将普通表 Transfer 到广播日志流上，同时也不支持将复制表 Transfer 到普通日志流上。
 - 不支持 Transfer 非独立的分区，例如，局部索引表的分区和 LOB 表的分区不支持 Transfer。
 - 对于同一个分区，在 Transfer Partition 操作未完成之前，不允许再次发起 Transfer Partition 操作。
 - 如果当前集群中已经有一个均衡任务（Balance Job）正在处理，手动触发的 Transfer Partition 任务不会立刻开始调度。如果希望尽快调度 Transfer Partition 任务，可以先取消该 Balance Job 任务，取消 Balance Job 任务的详细操作，请参见 [取消 Balance Job](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005682000)。

## 前提条件

- Transfer Partition 前，需要开启 Transfer 功能。Transfer 功能由租户级配置项 `enable_transfer` 控制，默认值为 `true`，表示开启 Transfer 功能。有关配置项 `enable_transfer` 的详细说明及设置，请参见 [enable_transfer](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005685396)。
 - 由于 Transfer Partition 策略与自动均衡策略可能会有冲突，为了保证分区位置固定，建议您在执行 Transfer Partition 操作前关闭自动均衡策略，即，将对应租户下配置项 `enable_rebalance` 的值设置为 `false`。有关配置项 `enable_rebalance` 的详细说明及设置，请参见 [enable_rebalance](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005685453)。

  Transfer Partition 操作本身不受配置项 `enable_rebalance` 的控制，但当 `enable_rebalance` 与 `enable_transfer` 的值均为 `true` 时，可能会出现用户将某个分区迁移到对应的日志流上后，系统的自动均衡策略又将该分区迁移到其他日志流上的情况。

## 系统租户 Transfer Partition

1. 使用 `root` 用户登录到集群的 `sys` 租户。

   连接示例如下，连接数据库时请以实际环境为准。

   ```shell
   obclient -h10.xx.xx.xx -P2883 -uroot@sys#obdemo -p***** -A

   ```
 2. 查询视图 `DBA_OB_TENANTS`，获取目标租户的 `TENANT_ID`。

   ```shell
   obclient(root@sys)[oceanbase]> SELECT TENANT_ID FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME = 'oracle_tenant';

   ```

   查询结果如下：

   ```shell
   +-----------+
   | TENANT_ID |
   +-----------+
   |      1006 |
   +-----------+
   1 row in set

   ```
 3. 确认分区信息。

   可以通过查询视图 `CDB_OB_TABLE_LOCATIONS`，获取表中指定分区对应的 `TABLE_ID`、`OBJECT_ID` 以及 `LS_ID`。

      - 获取非分区表中指定分区对应的 `TABLE_ID`、`OBJECT_ID` 以及 `LS_ID`

       假设 `oracle_tenant` 租户下存在非分区表 `T1`，查询示例如下：

       ```shell
       obclient(root@sys)[oceanbase]> SELECT TABLE_ID AS TABLE_ID, OBJECT_ID, TABLET_ID, LS_ID FROM oceanbase.CDB_OB_TABLE_LOCATIONS WHERE TENANT_ID = 1006 AND DATABASE_NAME = 'SYS' AND TABLE_NAME= 'T1' LIMIT 1;

       ```

       查询结果如下：

       ```shell
       +----------+-----------+-----------+-------+
       | TABLE_ID | OBJECT_ID | TABLET_ID | LS_ID |
       +----------+-----------+-----------+-------+
       |   500002 |    500002 |    200001 |  1001 |
       +----------+-----------+-----------+-------+
       1 row in set

       ```
      - 获取一级分区表中指定分区对应的 `TABLE_ID`、`OBJECT_ID` 以及 `LS_ID`

       对于一级分区表，查询时只需要指定具体的一级分区名即可。

       假设 `oracle_tenant` 租户下存在一级分区表 `TBL1_LOG_R`。

       ```shell
       obclient(SYS@oracle_tenant)[SYS]> CREATE TABLE tbl1_log_r(log_id INT,log_date DATE NOT NULL DEFAULT SYSDATE)
        PARTITION BY RANGE(log_date)
         (PARTITION M202001 VALUES LESS THAN(TO_DATE('2020/02/01','YYYY/MM/DD'))
          , PARTITION M202002 VALUES LESS THAN(TO_DATE('2020/03/01','YYYY/MM/DD'))
          , PARTITION M202003 VALUES LESS THAN(TO_DATE('2020/04/01','YYYY/MM/DD'))
          , PARTITION M202004 VALUES LESS THAN(TO_DATE('2020/05/01','YYYY/MM/DD'))
          , PARTITION M202005 VALUES LESS THAN(TO_DATE('2020/06/01','YYYY/MM/DD'))
          , PARTITION M202006 VALUES LESS THAN(TO_DATE('2020/07/01','YYYY/MM/DD'))
          , PARTITION M202007 VALUES LESS THAN(TO_DATE('2020/08/01','YYYY/MM/DD'))
          , PARTITION M202008 VALUES LESS THAN(TO_DATE('2020/09/01','YYYY/MM/DD'))
          , PARTITION M202009 VALUES LESS THAN(TO_DATE('2020/10/01','YYYY/MM/DD'))
          , PARTITION M202010 VALUES LESS THAN(TO_DATE('2020/11/01','YYYY/MM/DD'))
          , PARTITION M202011 VALUES LESS THAN(TO_DATE('2020/12/01','YYYY/MM/DD'))
          , PARTITION M202012 VALUES LESS THAN(TO_DATE('2021/01/01','YYYY/MM/DD'))
          , PARTITION MMAX VALUES LESS THAN (MAXVALUE)
          );

       ```

       查询该一级分区表中分区 `M202005` 相关信息的示例如下：

       ```shell
       obclient(root@sys)[oceanbase]> SELECT TABLE_ID AS TABLE_ID, OBJECT_ID, TABLET_ID, LS_ID FROM oceanbase.CDB_OB_TABLE_LOCATIONS WHERE TENANT_ID = 1006 AND DATABASE_NAME = 'SYS' AND TABLE_NAME= 'TBL1_LOG_R' AND PARTITION_NAME = 'M202005' LIMIT 1;

       ```

       查询结果如下：

       ```shell
       +----------+-----------+-----------+-------+
       | TABLE_ID | OBJECT_ID | TABLET_ID | LS_ID |
       +----------+-----------+-----------+-------+
       |   500003 |    500009 |    200006 |  1002 |
       +----------+-----------+-----------+-------+
       1 row in set

       ```
      - 获取二级分区表中二级分区对应的 `TABLE_ID`、`OBJECT_ID` 以及 `LS_ID`

       对于二级分区表，查询时需要同时指定一级分区名和二级分区名。

       假设 `oracle_tenant` 租户下存在二级分区表 `T2_F_RL`。

       ```shell
       obclient(SYS@oracle_tenant)[SYS]> CREATE TABLE t2_f_rl(col1 INT,col2 VARCHAR2(50))
        PARTITION BY RANGE(col1)
        SUBPARTITION BY LIST(col2)
        (PARTITION p0 VALUES LESS THAN(100)
          (SUBPARTITION sp0 VALUES('01'),
           SUBPARTITION sp1 VALUES('02')
           ),
         PARTITION p1 VALUES LESS THAN(200)
          (SUBPARTITION sp2 VALUES('01'),
           SUBPARTITION sp3 VALUES('02'),
           SUBPARTITION sp4 VALUES('03')
          )
         );

       ```

       查询该二级分区表中二级分区 `SP2` 相关信息的示例如下：

       ```shell
       obclient(root@sys)[oceanbase]> SELECT TABLE_ID AS TABLE_ID, OBJECT_ID, TABLET_ID, LS_ID FROM oceanbase.CDB_OB_TABLE_LOCATIONS WHERE TENANT_ID = 1006 AND DATABASE_NAME = 'SYS' AND TABLE_NAME= 'T2_F_RL' AND PARTITION_NAME = 'P1' AND SUBPARTITION_NAME = 'SP2' LIMIT 1;

       ```

       查询结果如下：

       ```shell
       +----------+-----------+-----------+-------+
       | TABLE_ID | OBJECT_ID | TABLET_ID | LS_ID |
       +----------+-----------+-----------+-------+
       |   500018 |    500023 |    200017 |  1003 |
       +----------+-----------+-----------+-------+
       1 row in set

       ```
 4. 选择 Transfer 目的端。

      1. 查询视图 `CDB_OB_LS`，获取租户的日志流状态和信息。

        ```shell
        obclient(root@sys)[oceanbase]> SELECT * FROM oceanbase.CDB_OB_LS WHERE TENANT_ID = 1006;

        ```

        查询结果如下：

        ```shell
        +-----------+-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+------+-----------+
        | TENANT_ID | LS_ID | STATUS | PRIMARY_ZONE | UNIT_GROUP_ID | LS_GROUP_ID | CREATE_SCN          | DROP_SCN | SYNC_SCN            | READABLE_SCN        | FLAG | UNIT_LIST |
        +-----------+-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+------+-----------+
        |      1006 |     1 | NORMAL | zone1        |             0 |           0 |                NULL |     NULL | 1701244663685197789 | 1701244663685197789 |      |           |
        |      1006 |  1001 | NORMAL | zone1        |             0 |        1001 | 1701239786827662637 |     NULL | 1701244663685197789 | 1701244663685197789 |      | 1001      |
        |      1006 |  1002 | NORMAL | zone1        |             0 |        1002 | 1701239786831568305 |     NULL | 1701244664066906860 | 1701244664066906859 |      | 1002      |
        |      1006 |  1003 | NORMAL | zone1        |             0 |        1003 | 1701239786834300282 |     NULL | 1701244664175263949 | 1701244664175263948 |      | 1003      |
        +-----------+-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+------+-----------+
        4 rows in set

        ```
      2. 查询视图 `CDB_OB_TABLET_TO_LS`，获取日志流上 Tablet 的分布信息。

        ```shell
        obclient(root@sys)[oceanbase]> SELECT LS_ID, COUNT(*) AS C FROM oceanbase.CDB_OB_TABLET_TO_LS WHERE TENANT_ID = 1006 GROUP BY LS_ID;

        ```

        查询结果如下：

        ```shell
        +-------+------+
        | LS_ID | C    |
        +-------+------+
        |     1 |  578 |
        |  1001 |    7 |
        |  1002 |    5 |
        |  1003 |    7 |
        +-------+------+
        4 rows in set

        ```

        根据上述展示的信息，选择合适的日志流作为 Transfer 目的端。
 5. 执行以下命令，进行 Transfer Partition 操作。

   ```shell
   ALTER SYSTEM TRANSFER PARTITION TABLE_ID [=] table_id, OBJECT_ID [=] object_id TO LS ls_id TENANT = 'tenant_name';

   ```

   其中：

      - `table_id`：表 ID。
      - `object_id`：分区的唯一标识。
      - `ls_id`：Transfer 目的端的日志流 ID。
      - `tenant_name`：待 Transfer 的分区所属的租户。

   以租户 `oracle_tenant` 为例，将其 `SYS` 库下的表 `TBL1_LOG_R` 的 `M202005` 分区，从当前 `1002` 号日志流迁移到 `1003` 号日志流上，示例如下。

   ```shell
   obclient(root@sys)[oceanbase]> ALTER SYSTEM TRANSFER PARTITION TABLE_ID = 500003, OBJECT_ID = 500009 TO LS 1003 TENANT = 'oracle_tenant';

   ```
 6. Transfer Partition 命令执行成功后，可以通过以下视图查看任务状态。

      1. 查询视图 `CDB_OB_TRANSFER_PARTITION_TASKS`，获取任务的 `TASK_ID`、`TRANSFER_TASK_ID` 和 `BALANCE_JOB_ID`。

        视图 `CDB_OB_TRANSFER_PARTITION_TASKS` 展示了所有租户当前正在处理的分区 Transfer 任务。查询示例如下：

        ```shell
        obclient(root@sys)[oceanbase]> SELECT TASK_ID, BALANCE_JOB_ID, TRANSFER_TASK_ID, STATUS FROM oceanbase.CDB_OB_TRANSFER_PARTITION_TASKS WHERE TENANT_ID = 1006 AND TABLE_ID = 500003 AND OBJECT_ID = 500009;

        ```

        查询结果的示例如下：

        ```shell
        +---------+----------------+------------------+--------+
        | TASK_ID | BALANCE_JOB_ID | TRANSFER_TASK_ID | STATUS |
        +---------+----------------+------------------+--------+
        |       1 |          17304 |                1 | DOING  |
        +---------+----------------+------------------+--------+
        1 row in set

        ```

        可以根据查询结果中 `STATUS` 的值确认任务状态，进一步查看任务执行进度：

             - `WAITING`: 表示任务在等待中，还没有开始调度。
             - `INIT`：表示任务已经构建 `BALANCE_JOB` 了，您可以根据 `BALANCE_JOB_ID` 查看关联的 `BALANCE_JOB` 执行进度。
             - `DOING`: 表示任务已经开始执行 Transfer 了，您可以根据 `TRANSFER_TASK_ID` 查看关联的 Transfer Partition 任务，`TRANSFER_TASK_ID` 会变化很多次，一个 Transfer Partition 任务会涉及多次 Transfer。

        如果视图 `CDB_OB_TRANSFER_PARTITION_TASKS` 的查询结果为空，可以通过视图 `CDB_OB_TRANSFER_PARTITION_TASK_HISTORY` 来查看任务结果。
      2. 根据获取的 `BALANCE_JOB_ID` 查询视图 `CDB_OB_BALANCE_JOBS` 或 `CDB_OB_BALANCE_JOB_HISTORY`，确认关联的 BALANCE_JOB 的执行状态。

        视图 `CDB_OB_BALANCE_JOBS` 展示了所有租户当前正在执行的负载均衡工作。每个租户同一时间只有一个负载均衡工作（BALANCE_JOB），每个工作会生成多个负载均衡任务（TRANSFER_TASK）。视图 `CDB_OB_BALANCE_JOB_HISTORY` 展示了所有租户已执行的负载均衡工作历史。查询示例如下：

        ```shell
        obclient(root@sys)[oceanbase]> SELECT * FROM oceanbase.CDB_OB_BALANCE_JOBS WHERE JOB_ID = 17304;

        ```

        ```shell
        obclient(root@sys)[oceanbase]> SELECT * FROM oceanbase.CDB_OB_BALANCE_JOB_HISTORY WHERE JOB_ID = 17304;

        ```

        其中，`17304` 需要替换为上一步获取的 `BALANCE_JOB_ID`。

        查询结果中的 `STATUS` 列展示了 `BALANCE_JOB` 的执行状态：

             - `DOING`：表示正在执行负载均衡工作。
             - `COMPLETED`：表示负载均衡工作执行成功。
             - `CANCELING`：表示负载均衡工作取消中。
             - `CANCELED`：表示负载均衡工作已取消。
      3. 根据获取的 `TRANSFER_TASK_ID` 查询视图 `CDB_OB_TRANSFER_TASKS` 或 `CDB_OB_TRANSFER_TASK_HISTORY`，确认任务关联的 TRANSFER_TASK 的执行状态。

        视图 `CDB_OB_TRANSFER_TASKS` 展示了所有租户当前正在执行的负载均衡任务。同一时间可能有多个负载均衡任务正在执行，这些任务（TRANSFER_TASK）都属于同一个负载均衡工作（BALANCE_JOB）。视图 `CDB_OB_TRANSFER_TASK_HISTORY` 展示了所有租户已执行的负载均衡任务历史。查询示例如下：

        ```shell
        obclient(root@sys)[oceanbase]> SELECT * FROM oceanbase.CDB_OB_TRANSFER_TASKS WHERE TASK_ID = 1;

        ```

        ```shell
        obclient(root@sys)[oceanbase]> SELECT * FROM oceanbase.CDB_OB_TRANSFER_TASK_HISTORY WHERE TASK_ID = 1;

        ```

        其中，`1` 需要替换为前面步骤中获取的 `TRANSFER_TASK_ID`。

        查询结果中的 `STATUS` 列展示了 `TRANSFER_TASK` 的执行状态：

             - `INIT`：表示正在创建任务。
             - `START`：表示开始执行 Transfer。
             - `DOING`：表示正在执行 Transfer。
             - `ABORTED`：表示 Transfer 任务执行失败，任务终止。
             - `COMPLETED`：表示 Transfer 任务执行成功。
             - `FAILED`：表示 Transfer 任务执行失败。
             - `CANCELED`：表示 Transfer 任务取消。
      4. 根据获取的 `TASK_ID` 查询视图 `CDB_OB_TRANSFER_PARTITION_TASK_HISTORY`，确认 Transfer Partition 任务的结果。

        视图 `CDB_OB_TRANSFER_PARTITION_TASK_HISTORY` 展示了所有租户已执行的 Transfer Partition 任务历史。

        ```shell
        obclient(root@sys)[oceanbase]> SELECT * FROM oceanbase.CDB_OB_TRANSFER_PARTITION_TASK_HISTORY WHERE TASK_ID = 1;

        ```

        其中，`1` 需要替换为前面步骤中获取的 `TASK_ID`。

        查询结果中的 `STATUS` 列展示了 Transfer Partition 任务的结果：

             - `COMPLETED`：表示 Transfer Partition 任务执行成功。
             - `FAILED` ：表示 Transfer Partition 任务执行失败，可以通过 `COMMENT` 列进一步确认任务失败的原因。`COMMENT` 列中常见的信息如下：

                     - `LS not exist or may be in DROPPING/WAIT_OFFLINE status`：Transfer 目的端的日志流可能不存在，或者处于 `DROPPING`、`WAITOFFLINE` 的状态。
                     - `LS status is not NORMAL or is in BLOCK_TABLET_IN state`：Transfer 目的端的日志流可能不是 `NORMAL` 的状态，例如，处于 `CREATING` 或 `CREATED` 等状态，或者日志流已经被 `BLOCK_TABLET_IN`，不可以迁入。
                     - `Table has beed dropped`：待 Transfer 的分区所属的表被删除。
                     - `Partition has beed dropped`：待 Transfer 的分区被删除。
                     - `Partition is already in dest LS`：分区已经在 Transfer 目的端上。
                     - `Need retry, partition may be dropped`：在 Transfer 执行时，分区已经被删除了，系统会在下次生成负载均衡任务的时候重新检查确定分区是否存在。
                     - `Need retry, partition may be dropped or be transferre`：在 Transfer 执行时，分区不存在了，可能是由于分区被删除，或者分区不在源端日志流上了，系统会在下次生成负载均衡任务的时候排查分区是否存在或者需要重新生成 Transfer 任务。
 7. Transfer Partition 任务执行成功后，再次查看对应的分区信息。

   ```

   查询结果如下：

   ```shell
   +----------+-----------+-----------+-------+
   | TABLE_ID | OBJECT_ID | TABLET_ID | LS_ID |
   +----------+-----------+-----------+-------+
   |   500003 |    500009 |    200006 |  1003 |
   +----------+-----------+-----------+-------+
   1 row in set

   ```

   根据结果可知，`SYS` 库下的表 `TBL1_LOG_R` 的 `M202005` 分区，从之前的 `1002` 号日志流迁移到了 `1003` 号日志流上，Transfer Partition 操作成功。

## 用户租户 Transfer Partition

    MySQL 模式   Oracle 模式

本文档以租户 `mysql_tenant` 为例，提供操作指导。

1. MySQL 模式租户的租户管理员连接数据库。

   ```shell
   obclient -h10.xx.xx.xx -P2883 -uroot@mysql_tenant#obdemo -p***** -A

   ```
 2. 确认分区信息。

   查询视图 `DBA_OB_TABLE_LOCATIONS`，获取指定分区的 `TABLE_ID`、`OBJECT_ID` 以及 `LS_ID`。

      - 获取非分区表的 `TABLE_ID`、`OBJECT_ID` 以及 `LS_ID`

       假设 `mysql_tenant` 租户下存在非分区表 `t1`，查询示例如下：

       ```shell
       obclient(root@mysql_tenant)[test]> SELECT TABLE_ID AS TABLE_ID, OBJECT_ID, TABLET_ID, LS_ID FROM oceanbase.DBA_OB_TABLE_LOCATIONS WHERE DATABASE_NAME = 'test' AND TABLE_NAME= 't1' LIMIT 1;

       ```

       查询结果如下：

       ```
      - 获取一级分区表的 `TABLE_ID`、`OBJECT_ID` 以及 `LS_ID`

       对于一级分区表，查询时只需要指定具体的一级分区名即可。示例如下：

       假设 `mysql_tenant` 租户下存在一级分区表 `tbl1_l`。

       ```shell
       obclient(root@mysql_tenant)[test]> CREATE TABLE tbl1_l (col1 BIGINT PRIMARY KEY,col2 VARCHAR(50))
        PARTITION BY LIST(col1)
         (PARTITION p0 VALUES IN (1, 2, 3),
          PARTITION p1 VALUES IN (5, 6),
          PARTITION p2 VALUES IN (DEFAULT)
         );

       ```

       查询该一级分区表中分区 `p1` 相关信息的示例如下：

       ```shell
       obclient(root@mysql_tenant)[oceanbase]> SELECT TABLE_ID AS TABLE_ID, OBJECT_ID, TABLET_ID, LS_ID FROM oceanbase.DBA_OB_TABLE_LOCATIONS WHERE DATABASE_NAME = 'test' AND TABLE_NAME= 'tbl1_l' AND PARTITION_NAME = 'p1' LIMIT 1;

       ```

       查询结果如下：

       ```shell
       +----------+-----------+-----------+-------+
       | TABLE_ID | OBJECT_ID | TABLET_ID | LS_ID |
       +----------+-----------+-----------+-------+
       |   500012 |    500014 |    200009 |  1001 |
       +----------+-----------+-----------+-------+
       1 row in set

       ```
      - 获取二级分区表的 `TABLE_ID`、`OBJECT_ID` 以及 `LS_ID`

       假设 `mysql_tenant` 租户下存在二级分区表 `t2_f_rclc`。

       ```shell
       obclient(root@mysql_tenant)[test]> CREATE TABLE t2_f_rclc (col1 INT,col2 INT)
        PARTITION BY RANGE COLUMNS(col1)
        SUBPARTITION BY LIST COLUMNS(col2)
        (PARTITION p0 VALUES LESS THAN(100)
          (SUBPARTITION sp0 VALUES IN(1,3),
           SUBPARTITION sp1 VALUES IN(4,6),
           SUBPARTITION sp2 VALUES IN(7,9)),
         PARTITION p1 VALUES LESS THAN(200)
          (SUBPARTITION sp3 VALUES IN(1,3),
           SUBPARTITION sp4 VALUES IN(4,6),
           SUBPARTITION sp5 VALUES IN(7,9))
        );

       ```

       查询该二级分区表中二级分区 `sp3` 相关信息的示例如下：

       ```shell
        obclient(root@mysql_tenant)[oceanbase]> SELECT TABLE_ID AS TABLE_ID, OBJECT_ID, TABLET_ID, LS_ID FROM oceanbase.DBA_OB_TABLE_LOCATIONS WHERE DATABASE_NAME = 'test' AND TABLE_NAME= 't2_f_rclc' AND PARTITION_NAME = 'P1' AND SUBPARTITION_NAME = 'sp3' LIMIT 1;

       ```

       查询结果如下：

       ```shell
       +----------+-----------+-----------+-------+
       | TABLE_ID | OBJECT_ID | TABLET_ID | LS_ID |
       +----------+-----------+-----------+-------+
       |   500003 |    500009 |    200005 |  1002 |
       +----------+-----------+-----------+-------+
       1 row in set

       ```
 3. 选择 Transfer 目的端。

      1. 查询视图 `DBA_OB_LS`，获取租户的日志流状态和信息。

        ```shell
        obclient(root@mysql_tenant)[oceanbase]> SELECT * FROM oceanbase.DBA_OB_LS;

        ```

        查询结果如下：

        ```shell
        +-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+------+-----------+
        | LS_ID | STATUS | PRIMARY_ZONE | UNIT_GROUP_ID | LS_GROUP_ID | CREATE_SCN          | DROP_SCN | SYNC_SCN            | READABLE_SCN        | FLAG | UNIT_LIST |
        +-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+------+-----------+
        |     1 | NORMAL | zone1        |             0 |           0 |                NULL |     NULL | 1701247658419109377 | 1701247658419109377 |      |           |
        |  1001 | NORMAL | zone1        |             0 |        1001 | 1701239750437064613 |     NULL | 1701247658419109376 | 1701247658419109376 |      | 1001      |
        |  1002 | NORMAL | zone1        |             0 |        1002 | 1701239750441114919 |     NULL | 1701247658223204599 | 1701247658223204599 |      | 1002      |
        |  1003 | NORMAL | zone1        |             0 |        1003 | 1701239750443869478 |     NULL | 1701247659122731843 | 1701247659030755559 |      | 1003      |
        +-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+------+-----------+
        4 rows in set

        ```
      2. 查询视图 `DBA_OB_TABLET_TO_LS`，获取日志流上 Tablet 的分布信息。

        ```shell
        obclient(root@mysql_tenant)[oceanbase]> SELECT LS_ID, COUNT(*) AS C FROM oceanbase.DBA_OB_TABLET_TO_LS GROUP BY LS_ID;

        ```

        查询结果如下：

        ```shell
        +-------+------+
        | LS_ID | C    |
        +-------+------+
        |     1 |  590 |
        |  1001 |    4 |
        |  1002 |    3 |
        |  1003 |    3 |
        +-------+------+
        4 rows in set

        ```

        根据上述展示的信息，选择合适的日志流作为 Transfer 目的端。
 4. 执行以下命令，进行 Transfer Partition 操作。

   ```sql
   ALTER SYSTEM TRANSFER PARTITION TABLE_ID [=] table_id, OBJECT_ID [=] object_id TO LS ls_id;

   ```

   其中：

      - `table_id`：表 ID。
      - `object_id`：分区的唯一标识。
      - `ls_id`： Transfer 目的端的日志流 ID。
      - `tenant_name`：待 Transfer 的分区所属的租户。

   将租户 `mysql_tenant` 内 `test` 库下的表 `tbl1_l` 的 `p1` 分区，从当前 `1001` 号日志流迁移到 `1003` 号日志流上，示例如下。

   ```shell
   obclient(root@mysql_tenant)[oceanbase]> ALTER SYSTEM TRANSFER PARTITION TABLE_ID = 500012, OBJECT_ID = 500014 TO LS 1003;

   ```
 5. Transfer Partition 的命令执行成功后，可以通过以下视图查看任务状态。

      1. 查询视图 `DBA_OB_TRANSFER_PARTITION_TASKS`，获取任务的 `TASK_ID`、`TRANSFER_TASK_ID` 和 `BALANCE_JOB_ID`。

        视图 `DBA_OB_TRANSFER_PARTITION_TASKS` 展示了本租户下当前正在处理的 Transfer Partition 任务。查询示例如下：

        ```shell
        obclient(root@mysql_tenant)[oceanbase]> SELECT TASK_ID, BALANCE_JOB_ID, TRANSFER_TASK_ID, STATUS FROM oceanbase.DBA_OB_TRANSFER_PARTITION_TASKS WHERE TABLE_ID = 500012 AND OBJECT_ID = 500014;

        ```

        ```shell
        +---------+----------------+------------------+--------+
        | TASK_ID | BALANCE_JOB_ID | TRANSFER_TASK_ID | STATUS |
        +---------+----------------+------------------+--------+
        |       1 |          26506 |                1 | DOING  |
        +---------+----------------+------------------+--------+
        1 row in set

        ```

        如果视图 `DBA_OB_TRANSFER_PARTITION_TASKS` 的查询结果为空，可以通过视图 `DBA_OB_TRANSFER_PARTITION_TASK_HISTORY` 来查看任务结果。
      2. 根据获取的 `BALANCE_JOB_ID` 查询视图 `DBA_OB_BALANCE_JOBS` 或 `DBA_OB_BALANCE_JOB_HISTORY`，确认关联的 `BALANCE_JOB` 的执行状态。

        视图 `DBA_OB_BALANCE_JOBS` 展示了本租户当前正在执行的负载均衡工作。每个租户同一时间只有一个负载均衡工作（BALANCE_JOB），每个工作会生成多个负载均衡任务（TRANSFER_TASK）。视图 `DBA_OB_BALANCE_JOB_HISTORY` 展示了本租户已执行的负载均衡工作历史。查询示例如下：

        ```shell
        obclient [oceanbase]> SELECT * FROM oceanbase.DBA_OB_BALANCE_JOBS WHERE JOB_ID = 26506;
        obclient(root@mysql_tenant)[oceanbase]>```

        ```shell
        obclient(root@mysql_tenant)[oceanbase]> SELECT * FROM oceanbase.DBA_OB_BALANCE_JOB_HISTORY WHERE JOB_ID = 26506;

        ```

        其中，`26506` 需要替换为上一步获取的 `BALANCE_JOB_ID`。

             - `DOING`：表示正在执行负载均衡工作。
             - `COMPLETED`：表示负载均衡工作执行成功。
             - `CANCELING`：表示负载均衡工作取消中。
             - `CANCELED`：表示负载均衡工作已取消。
      3. 根据获取的 `TRANSFER_TASK_ID` 查询视图 `DBA_OB_TRANSFER_TASKS` 或 `DBA_OB_TRANSFER_TASK_HISTORY`，确认任务关联的 `TRANSFER_TASK` 的执行状态。

        视图 `DBA_OB_TRANSFER_TASKS` 展示了本租户当前正在执行的负载均衡任务。同一时间可能有多个负载均衡任务正在执行，这些任务（TRANSFER_TASK）都属于同一个负载均衡工作（BALANCE_JOB）。视图 `DBA_OB_TRANSFER_TASK_HISTORY` 展示了本租户已执行的负载均衡任务历史。查询示例如下：

        ```shell
        obclient(root@mysql_tenant)[oceanbase]> SELECT * FROM oceanbase.DBA_OB_TRANSFER_TASKS WHERE TASK_ID = 1;

        ```

        ```shell
        obclient(root@mysql_tenant)[oceanbase]> SELECT * FROM oceanbase.DBA_OB_TRANSFER_TASK_HISTORY WHERE TASK_ID = 1;

        ```

             - `INIT`：表示正在创建任务。
             - `START`：表示开始执行 Transfer。
             - `DOING`：表示正在执行 Transfer。
             - `ABORTED`：表示 Transfer 任务执行失败，任务终止。
             - `COMPLETED`：表示 Transfer 任务执行成功。
             - `FAILED`：表示 Transfer 任务执行失败。
             - `CANCELED`：表示 Transfer 任务已取消。
      4. 根据获取的 `TASK_ID` 查询视图 `DBA_OB_TRANSFER_PARTITION_TASK_HISTORY`，确认 Transfer Partition 任务的结果。

        视图 `DBA_OB_TRANSFER_PARTITION_TASK_HISTORY` 展示了本租户已执行的 Transfer Partition 任务历史。查询示例如下：

        ```shell
        obclient(root@mysql_tenant)[oceanbase]> SELECT * FROM oceanbase.DBA_OB_TRANSFER_PARTITION_TASK_HISTORY WHERE TASK_ID = 1;

        ```

                     - `LS not exist or may be in DROPPING/WAIT_OFFLINE status`：Transfer 目的端的日志流可能不存在，或者处于 `DROPPING`、`WAITOFFLINE` 的状态。
                     - `LS status is not NORMAL or is in BLOCK_TABLET_IN state`：Transfer 目的端的日志流可能不是 `NORMAL` 的状态，例如，处于 `CREATING` 或 `CREATED` 等状态，或者日志流已经被 `BLOCK_TABLET_IN`，不可以迁入。
                     - `Table has beed dropped`：待 Transfer 的分区所属的表被删除。
                     - `Partition has beed dropped`：待 Transfer 的分区被删除。
                     - `Partition is already in dest LS`：分区已经在 Transfer 目的端上。
                     - `Need retry, partition may be dropped`：在 Transfer 执行时，分区已经被删除了，系统会在下次生成负载均衡任务的时候重新检查确定分区是否存在。
                     - `Need retry, partition may be dropped or be transferre`：在 Transfer 执行时，分区不存在了，可能是由于分区被删除，或者分区不在源端日志流上了，系统会在下次生成负载均衡任务的时候排查分区是否存在或者需要重新生成 Transfer 任务。
 6. Transfer Partition 任务执行成功后，再次查看对应的分区信息。

   ```

   查询结果如下：

   ```shell
   +----------+-----------+-----------+-------+
   | TABLE_ID | OBJECT_ID | TABLET_ID | LS_ID |
   +----------+-----------+-----------+-------+
   |   500012 |    500014 |    200009 |  1003 |
   +----------+-----------+-----------+-------+
   1 row in set

   ```

   根据结果可知，`test` 库下的表 `tbl1_l` 的 `p1` 分区，从之前的 `1001` 号日志流迁移到了 `1003` 号日志流上，Transfer Partition 操作成功。

本文档以租户 `oracle_tenant` 为例，提供操作指导。

1. Oracle 模式租户的租户管理员连接数据库。

   ```shell
   obclient -h10.xx.xx.xx -P2883 -usys@oracle_tenant#obdemo -p***** -A

       ```shell
       obclient(sys@oracle_tenant)[SYS]> SELECT TABLE_ID AS TABLE_ID, OBJECT_ID, TABLET_ID, LS_ID FROM SYS.DBA_OB_TABLE_LOCATIONS WHERE DATABASE_NAME = 'SYS' AND TABLE_NAME= 'T1' AND ROWNUM = 1;

       ```

       查询结果如下：

       ```

       ```shell
       obclient(sys@oracle_tenant)[SYS]> SELECT TABLE_ID AS TABLE_ID, OBJECT_ID, TABLET_ID, LS_ID FROM SYS.DBA_OB_TABLE_LOCATIONS WHERE DATABASE_NAME = 'SYS' AND TABLE_NAME= 'TBL1_LOG_R' AND PARTITION_NAME = 'M202005' AND ROWNUM = 1;

       ```

       查询结果如下：

       ```

       ```shell
       obclient(sys@oracle_tenant)[SYS]> SELECT TABLE_ID AS TABLE_ID, OBJECT_ID, TABLET_ID, LS_ID FROM SYS.DBA_OB_TABLE_LOCATIONS WHERE DATABASE_NAME = 'SYS' AND TABLE_NAME= 'T2_F_RL' AND PARTITION_NAME = 'P1' AND SUBPARTITION_NAME = 'SP2' AND ROWNUM = 1;

       ```

       查询结果如下：

        ```shell
        obclient(sys@oracle_tenant)[SYS]> SELECT * FROM SYS.DBA_OB_LS;

        ```

        查询结果如下：

        ```shell
        obclient(sys@oracle_tenant)[SYS]> SELECT LS_ID, COUNT(*) AS C FROM SYS.DBA_OB_TABLET_TO_LS GROUP BY LS_ID;

        ```

        查询结果如下：

        ```

   ```

   其中：

   将租户 `oracle_tenant` 内 `SYS` 库下的表 `TBL1_LOG_R` 的 `M202005` 分区，从当前 `1002` 号日志流迁移到 `1003` 号日志流上，示例如下。

   ```shell
   obclient [SYS]> ALTER SYSTEM TRANSFER PARTITION TABLE_ID = 500003, OBJECT_ID = 500009 TO LS 1003;

        ```shell
        obclient(sys@oracle_tenant)[SYS]> SELECT TASK_ID, BALANCE_JOB_ID, TRANSFER_TASK_ID, STATUS FROM SYS.DBA_OB_TRANSFER_PARTITION_TASKS WHERE TABLE_ID = 500003 AND OBJECT_ID = 500009;

        ```

        ```

        ```shell
        obclient(sys@oracle_tenant)[SYS]> SELECT * FROM SYS.DBA_OB_BALANCE_JOBS WHERE JOB_ID = 17304;

        ```

        ```shell
        obclient(sys@oracle_tenant)[SYS]> SELECT * FROM SYS.DBA_OB_BALANCE_JOB_HISTORY WHERE JOB_ID = 17304;

        ```

        ```shell
        obclient(sys@oracle_tenant)[SYS]> SELECT * FROM SYS.DBA_OB_TRANSFER_TASKS WHERE TASK_ID = 1;

        ```

        ```shell
        obclient(sys@oracle_tenant)[SYS]> SELECT * FROM SYS.DBA_OB_TRANSFER_TASK_HISTORY WHERE TASK_ID = 1;

        ```

        ```shell
        obclient(sys@oracle_tenant)[SYS]> SELECT * FROM SYS.DBA_OB_TRANSFER_PARTITION_TASK_HISTORY WHERE TASK_ID = 1;

        ```

   ```

   查询结果如下：

   ```

## 相关文档

- [取消 Transfer Partition](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005681995)
 - [取消 Balance Job](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005682000)
 - [CDB_OB_TABLE_LOCATIONS](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005684145)
 - [DBA_OB_TABLE_LOCATIONS](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005683702)
 - [CDB_OB_LS](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005683901)
 - [DBA_OB_LS](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005683584)
 - [CDB_OB_TABLET_TO_LS](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005684192)
 - [DBA_OB_TABLET_TO_LS](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005683775)
 - [CDB_OB_BALANCE_JOBS](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005684048)
 - [DBA_OB_BALANCE_JOBS](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005683685)
 - [CDB_OB_BALANCE_JOB_HISTORY](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005683939)
 - [DBA_OB_BALANCE_JOB_HISTORY](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005683875)
 - [CDB_OB_TRANSFER_TASKS](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005684052)
 - [DBA_OB_TRANSFER_TASKS](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005683883)
 - [CDB_OB_TRANSFER_TASK_HISTORY](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005684211)
 - [DBA_OB_TRANSFER_TASK_HISTORY](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005683723)

 上一篇 下一篇 ![有帮助](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) 咨询热线
