---
title: "通过调整 Unit Number 实现租户扩缩容 - OceanBase 数据库 V4.6.0 | OceanBase 文档中心"
description: 通过调整 Unit Number 实现租户扩缩容 租户扩容和缩容本质上是提高和降低租户的服务能力，包括计算能力和存储容量。可以通过提高单节点的服务能力达成，也可以通过增加服务节点达成。本文介绍如何通过修改 Unit Number，从而增加或减少服务节点，达到租户总服务能力的提升或降低，实现租户的扩容或缩容。 修改 U…
---
切换语言

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

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

# 通过调整 Unit Number 实现租户扩缩容

更新时间：2026-04-30 19:06:39

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.6.0/zh-CN/600.manage/200.tenant-management/600.common-tenant-operations/800.tenant-scale-in-and-out/300.adjust-unit-number.md)  

租户扩容和缩容本质上是提高和降低租户的服务能力，包括计算能力和存储容量。可以通过提高单节点的服务能力达成，也可以通过增加服务节点达成。本文介绍如何通过修改 Unit Number，从而增加或减少服务节点，达到租户总服务能力的提升或降低，实现租户的扩容或缩容。

修改 Unit Number 包括调大或调小 Unit Number。

## 背景信息

在当前版本中，OceanBase 数据库支持租户的同构 Zone 模式和异构 Zone 模式：

- 同构 Zone 模式下，要求租户内每个 Zone 的 Unit 个数必须保持一致。同时为了方便统一管理各个 Zone 的 Unit，系统引入了 Unit Group 机制，即不同 Zone 之间相同编号（`UNIT_GROUP_ID`）的 Unit 属于同一个 Unit Group。对于同构 Zone 模式的租户，调大或调小 Unit Number 本质上是以 Unit Group 为单位创建和删除 Unit。
 - 异构 Zone 模式下，租户下各 Zone 的 `UNIT_NUM` 可以相同也可以不同，但一个租户的所有 Zone 最多只能有两种 `UNIT_NUM`。日志流分布不再与 Unit Group 绑定，各 Zone 的副本不再需要限制在对称的 Unit 上。对于异构 Zone 模式的租户，除了统一调大或调小租户的 Unit Number，如果有多个资源池，还可以单独调大或调小租户某一个资源池的 Unit Number，实现资源池粒度的扩缩容。

#### 注意

通常情况下，对于已有租户或者升级上来的租户，默认均为同构 Zone 模式，如果需要开启异构 Zone 模式，需要将租户级配置项 `zone_deploy_mode` 的值修改为 `hetero`（异构 Zone 模式）。修改后，不支持再改回 `homo`（同构 Zone 模式）。

## 前提条件

在进行租户的扩容和缩容操作前，需要进行以下操作：

- 设置租户内的负载均衡策略

  租户内的负载均衡策略由租户级配置项 `enable_rebalance` 和 `enable_transfer` 共同控制。

     - 配置项 `enable_rebalance` 在系统租户下用于控制是否进行租户间的负载均衡，在用户租户下用于控制是否进行租户内均衡。对租户进行扩缩容操作时，需要开启租户内的均衡。有关租户间均衡策略与租户内均衡策略的详细介绍，参见 [数据负载均衡最佳实践](https://www.oceanbase.com/docs/common-best-practices-1000000001489656)。该配置项的默认值为 `true`，表示开启均衡，设置后不需要重启 OBServer 节点，立即生效。
     - 配置项 `enable_transfer` 用于控制是否开启租户下的 Transfer 功能，默认值为 `true`，设置后不需要重启 OBServer 节点，立即生效。其中：

           - 当配置项 `enable_rebalance` 的值为 `false` 时，无论配置项 `enable_transfer` 的值为 `true` 还是 `false`，系统均不会进行自动负载均衡。
           - 当配置项 `enable_rebalance` 的值为 `true` 且 `enable_transfer` 的值为 `true` 时，表示在进行租户扩缩容操作时，系统会自动调整分区分布，实现负载均衡。
           - 当配置项 `enable_rebalance` 的值为 `true` 且 `enable_transfer` 的值为 `false` 时，表示在进行租户扩缩容操作时，系统不能发起 Transfer 操作，只能通过日志流迁移实现有限的均衡。

  具体设置方法如下：

     - 系统租户设置指定租户的负载均衡策略

           - 系统租户开启指定租户的租户内负载均衡和租户下的 Transfer 功能

            ```sql
            ALTER SYSTEM SET enable_rebalance = true TENANT = 'tenant_name';

            ```

            ```sql
            ALTER SYSTEM SET enable_transfer = true TENANT = 'tenant_name';

            ```

            以上语句表示仅指定租户下的配置项 `enable_rebalance` 和 `enable_transfer` 的值为 `true`。
           - 系统租户开启所有用户租户（不含 `sys` 租户和 Meta 租户）的租户内负载均衡和租户下的 Transfer 功能

            ```sql
            ALTER SYSTEM SET enable_rebalance = true TENANT = all_user;

            ```

            ```sql
            ALTER SYSTEM SET enable_transfer = true TENANT = all_user;

            ```

            或者

            ```sql
            ALTER SYSTEM SET enable_rebalance = true TENANT = all;

            ```

            ```sql
            ALTER SYSTEM SET enable_transfer = true TENANT = all;

            ```

            以上语句表示所有用户租户下配置项 `enable_rebalance` 和 `enable_transfer` 的值为 `true`。

            #### 说明

            OceanBase 数据库从 V4.2.1 版本开始，`TENANT = all_user` 与 `TENANT = all`语义相同，在需要生效范围为所有用户租户时，推荐使用 `TENANT = all_user`，后续 `TENANT = all` 将废弃不再使用。
     - 用户租户设置本租户的负载均衡策略

          MySQL 模式   Oracle 模式

      MySQL 租户开启本租户的租户内负载均衡和租户下的 Transfer 功能的语句如下：

      ```sql
      ALTER SYSTEM SET enable_rebalance = true;

      ```

      ```sql
      ALTER SYSTEM SET enable_transfer = true;

      ```

      Oracle 租户开启本租户的租户内负载均衡和租户下的 Transfer 功能的语句如下：

      ```sql
      ALTER SYSTEM SET enable_rebalance = 'true';

      ```

      ```sql
      ALTER SYSTEM SET enable_transfer = 'true';

      ```

  更多配置项 `enable_rebalance` 和 `enable_transfer` 的详细说明，请参见 [enable_rebalance](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005685453) 和 [enable_transfer](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005685396)。
 - 由于空闲的资源池会被计算为占用的资源，故在扩容前，如果有租户被删除，建议与租户对应的资源池也一并删除，以便释放资源。

  删除资源池的相关操作，参见 [删除资源池](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005682934)。
 - 进行租户缩容前，建议进行一轮转储以便释放租户正在使用的内存。

  手动触发转储的相关操作，参见 [手动触发转储](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005684845)。
 - 执行租户扩缩容操作前，建议先进行租户的资源规划，以便更好地达到预期效果。

  有关租户扩缩容资源规划的详细操作，参见[租户扩缩容资源规划](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005682936)。

## 注意事项

通过调整 Unit Number 来进行租户的扩缩容时，需要注意以下事项：

- 扩缩容过程中，禁止修改租户的 Locality。
 - 扩缩容过程中，禁止扩大租户资源池的 `ZONE_LIST` 范围。
 - 扩缩容过程中，禁止为租户添加新的资源池。
 - 扩缩容过程中，禁止合并资源池。
 - 扩缩容过程中，禁止对 `DELETING` 状态的 Unit 执行迁移操作。

## 调大 Unit Number

### 调大租户所有资源池的 Unit Number

对于同构 Zone 模式的租户或异构 Zone 模式的租户，均可以通过 `ALTER RESOURCE TENANT` 语句统一调大租户所有资源池的 Unit Number。下面以调大租户 `mysql001` 所有资源池的 Unit Number 为例来介绍操作方法。

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

   ```shell
   obclient -h172.30.xxx.xxx -P2883 -uroot@sys#obdemo -pxxxx -A

   ```
 2. 进入 `oceanbase` 数据库。

   ```shell
   obclient(root@sys)[(none)]> use oceanbase;

   ```
 3. 查看租户 `mysql001` 信息，获取其 `TENANT_ID`。

   ```shell
   obclient(root@sys)[oceanbase]> SELECT TENANT_ID, TENANT_NAME, TENANT_TYPE, PRIMARY_ZONE, LOCALITY, TENANT_ROLE, UNIT_NUM, ZONE_UNIT_NUM_LIST FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME = 'mysql001';

   ```

   查询结果如下：

   ```shell
   +-----------+-------------+-------------+--------------------+---------------------------------------------+-------------+----------+-------------------------+
   | TENANT_ID | TENANT_NAME | TENANT_TYPE | PRIMARY_ZONE       | LOCALITY                                    | TENANT_ROLE | UNIT_NUM | ZONE_UNIT_NUM_LIST      |
   +-----------+-------------+-------------+--------------------+---------------------------------------------+-------------+----------+-------------------------+
   |      1006 | mysql001    | USER        | zone1;zone2;zone3  | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | PRIMARY     |        1 | zone1:1,zone2:1,zone3:1 |
   +-----------+-------------+-------------+--------------------+---------------------------------------------+-------------+----------+-------------------------+
   1 row in set

   ```

   查询结果中，租户的 `TENANT_ID` 为 1006，且该租户在各个 Zone 上的 Unit Number 为 1:1:1。
 4. 查看租户 `mysql001` 所拥有的 Unit。

   ```shell
   obclient(root@sys)[oceanbase]> SELECT UNIT_ID, TENANT_ID, STATUS, RESOURCE_POOL_ID, UNIT_GROUP_ID, ZONE, UNIT_CONFIG_ID FROM oceanbase.DBA_OB_UNITS WHERE TENANT_ID = 1006;

   ```

   查询结果如下：

   ```shell
   +---------+-----------+--------+------------------+---------------+-------+----------------+
   | UNIT_ID | TENANT_ID | STATUS | RESOURCE_POOL_ID | UNIT_GROUP_ID | ZONE  | UNIT_CONFIG_ID |
   +---------+-----------+--------+------------------+---------------+-------+----------------+
   |    1013 |      1006 | ACTIVE |             1002 |          1023 | zone2 |           1001 |
   |    1014 |      1006 | ACTIVE |             1001 |          1023 | zone1 |           1001 |
   |    1015 |      1006 | ACTIVE |             1003 |          1023 | zone3 |           1001 |
   +---------+-----------+--------+------------------+---------------+-------+----------------+
   3 rows in set

   ```

   根据查询结果可知，租户 `mysql001` 的每个 Zone 各有 1 个 Unit，且这 3 个 Unit 对应的 `UNIT_GROUP_ID` 相同。
 5. 把租户 `mysql001` 的 `UNIT_NUM` 修改为 2。

   ```shell
   obclient(root@sys)[oceanbase]> ALTER RESOURCE TENANT mysql001 UNIT_NUM = 2;

   ```
 6. 命令执行成功后，查看当前 Unit 的状态。

   ```shell
   obclient> SELECT UNIT_ID, TENANT_ID, STATUS, RESOURCE_POOL_ID, UNIT_GROUP_ID, ZONE, UNIT_CONFIG_ID FROM oceanbase.DBA_OB_UNITS WHERE TENANT_ID = 1006;

   ```

   查询结果如下：

   ```shell
   +---------+-----------+--------+------------------+---------------+-------+----------------+
   | UNIT_ID | TENANT_ID | STATUS | RESOURCE_POOL_ID | UNIT_GROUP_ID | ZONE  | UNIT_CONFIG_ID |
   +---------+-----------+--------+------------------+---------------+-------+----------------+
   |    1013 |      1006 | ACTIVE |             1002 |          1024 | zone2 |           1001 |
   |    1014 |      1006 | ACTIVE |             1001 |          1024 | zone1 |           1001 |
   |    1015 |      1006 | ACTIVE |             1003 |          1024 | zone3 |           1001 |
   |    1025 |      1006 | ADDING |             1001 |          1025 | zone1 |           1001 |
   |    1026 |      1006 | ADDING |             1002 |          1025 | zone2 |           1001 |
   |    1027 |      1006 | ADDING |             1003 |          1025 | zone3 |           1001 |
   +---------+-----------+--------+------------------+---------------+-------+----------------+
   6 rows in set

   ```

   可以看到，待新增的 Unit 均为 `ADDING` 状态，待内部均衡完成后，Unit 状态就会从 `ADDING` 状态转为 `ACTIVE` 状态。

   #### 注意

      - OceanBase 数据库在之前的版本（不包含 V4.2.5 版本中，V4.2.5 BP5 版本及其之后的 BP 版本、V4.4.2 及其之后的版本）中，`UNIT_NUM` 扩容为同步过程，在当前版本中，`UNIT_NUM` 扩容为异步过程，待新增的 Unit 为 `ADDING` 状态。
      - 扩容过程中（待新增的 Unit 仍为 `ADDING` 状态），支持回滚操作。

       例如，本示例中，可以执行 `ALTER RESOURCE TENANT mysql001 UNIT_NUM = 1;` 语句将 `UNIT_NUM`改回为原来的值。回滚时，原 `ADDING` 状态的 Unit 直接转变为 `DELETING` 状态。需要注意的是，执行回滚操作时，不支持通过删除指定 UNIT_GROUP 的方式来回滚，系统会自动选择 `ADDING` 状态的 Unit 进行删除。
      - 扩容过程结束前，仅允许执行回滚操作，禁止修改 `UNIT_NUM` 为其他值。
 7. 查看调大 Unit Number 任务的执行状态。

   ```shell
   obclient(root@sys)[oceanbase]> SELECT * FROM oceanbase.DBA_OB_TENANT_JOBS WHERE JOB_TYPE = 'ALTER_RESOURCE_TENANT_UNIT_NUM' AND TENANT_ID=1006;

   ```

   查询结果如下：

   ```shell
   +--------+--------------------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+-----------------------------------------------------------+-------------------+--------------+-------------+
   | JOB_ID | JOB_TYPE                       | JOB_STATUS | RESULT_CODE | PROGRESS | START_TIME                 | MODIFY_TIME                | TENANT_ID | SQL_TEXT                                                  | EXTRA_INFO        | RS_SVR_IP    | RS_SVR_PORT |
   +--------+--------------------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+-----------------------------------------------------------+-------------------+--------------+-------------+
   |     26 | ALTER_RESOURCE_TENANT_UNIT_NUM | SUCCESS    |           0 |      100 | 2025-06-18 10:10:19.430962 | 2025-06-18 10:10:54.229794 |      1006 | ALTER RESOURCE TENANT mysql001 UNIT_NUM = 2               | new unit num: '2' | 6.xx.xxx.xxx |       29700 |
   +--------+--------------------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+-----------------------------------------------------------+-------------------+--------------+-------------+
   1 row in set

   ```

   查询结果中，根据以下字段，找到对应的任务记录：

      - `START_TIME`：任务的发起时间。
      - `SQL_TEXT`：任务对应的 SQL 语句。
      - `EXTRA_INFO`：变更前后的 Unit Number 数。

   当对应变更记录中 `JOB_STATUS` 的值为 `SUCCESS` 时，表示调大 Unit Number 的任务执行成功。

   有关视图 `DBA_OB_TENANT_JOBS` 的详细字段说明，请参见 [DBA_OB_TENANT_JOBS](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005684078)。
 8. 查看租户 `mysql001` 修改后的 Unit。

   ```

   查询结果如下：

   ```shell
   +---------+-----------+--------+------------------+---------------+-------+----------------+
   | UNIT_ID | TENANT_ID | STATUS | RESOURCE_POOL_ID | UNIT_GROUP_ID | ZONE  | UNIT_CONFIG_ID |
   +---------+-----------+--------+------------------+---------------+-------+----------------+
   |    1013 |      1006 | ACTIVE |             1002 |          1024 | zone2 |           1001 |
   |    1014 |      1006 | ACTIVE |             1001 |          1024 | zone1 |           1001 |
   |    1015 |      1006 | ACTIVE |             1003 |          1024 | zone3 |           1001 |
   |    1025 |      1006 | ACTIVE |             1001 |          1025 | zone1 |           1001 |
   |    1026 |      1006 | ACTIVE |             1002 |          1025 | zone2 |           1001 |
   |    1027 |      1006 | ACTIVE |             1003 |          1025 | zone3 |           1001 |
   +---------+-----------+--------+------------------+---------------+-------+----------------+
   6 rows in set

   ```

通过上述示例，将租户 `mysql001` 所有资源池的 Unit Number 从 1 变更为 2。变更前租户在每个 Zone 的 Unit 个数为 1；变更后租户在每个 Zone 的 Unit 个数为 2，从而实现了租户扩容。

### 调大租户单个资源池的 Unit Number

对于异构 Zone 模式的租户，如果有多个资源池，还可以通过 `ALTER RESOURCE POOL` 语句单独调大租户某个资源池的 Unit Number。同构 Zone 模式租户不支持该方式。

下面以调大租户 `mysql001` 的其中一个资源池 `pool2` 的 Unit Number 为例来介绍操作方法。

   ```

   查询结果如下：

   ```shell
   +-----------+-------------+-------------+--------------------+---------------------------------------------+-------------+----------+-------------------------+
   | TENANT_ID | TENANT_NAME | TENANT_TYPE | PRIMARY_ZONE       | LOCALITY                                    | TENANT_ROLE | UNIT_NUM | ZONE_UNIT_NUM_LIST      |
   +-----------+-------------+-------------+--------------------+---------------------------------------------+-------------+----------+-------------------------+
   |      1006 | mysql001    | USER        | zone1;zone2;zone3  | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | PRIMARY     |        2 | zone1:2,zone2:2,zone3:2 |
   +-----------+-------------+-------------+--------------------+---------------------------------------------+-------------+----------+-------------------------+
   1 row in set

   ```

   查询结果中，租户的 `TENANT_ID` 为 1006，且该租户在各个 Zone 上的 Unit Number 为 2:2:2。
 4. 查看当前租户的资源配置信息。

   ```shell
   obclient(root@sys)[oceanbase]> SELECT c.TENANT_ID, e.TENANT_NAME, concat(c.NAME, ': ', d.NAME) `pool:conf`,c.ZONE_LIST, concat(c.UNIT_COUNT, ' unit: ', d.min_cpu, 'C/', ROUND(d.MEMORY_SIZE/1024/1024/1024,0), "G") unit_info
                FROM oceanbase.DBA_OB_RESOURCE_POOLS c, oceanbase.DBA_OB_UNIT_CONFIGS d, oceanbase.DBA_OB_TENANTS e
                WHERE c.UNIT_CONFIG_ID=d.UNIT_CONFIG_ID AND c.TENANT_ID=e.TENANT_ID AND c.TENANT_ID=1006;

   ```

   查询结果如下：

   ```shell
   +-----------+-------------+------------------+-----------+---------------+
   | TENANT_ID | TENANT_NAME | pool:conf        | ZONE_LIST | unit_info     |
   +-----------+-------------+------------------+-----------+---------------+
   |      1006 | mysql001    | pool3: test_unit |   zone3   | 2 unit: 1C/8G |
   |      1006 | mysql001    | pool2: test_unit |   zone2   | 2 unit: 1C/8G |
   |      1006 | mysql001    | pool1: test_unit |   zone1   | 2 unit: 1C/8G |
   +-----------+-------------+------------------+-----------+---------------+
   3 rows in set

   ```

   根据查询结果可知，租户 `mysql001` 有 `pool1`、`pool2`、`pool3` 共 3 个资源池，分别分布在 `zone1`、`zone2` 和 `zone3` 上。
 5. 根据实际需求，将租户 `mysql001` 的资源池 `pool2` 的 `UNIT_NUM` 修改为 3。

   ```shell
   obclient(root@sys)[oceanbase]> ALTER RESOURCE POOL pool2 UNIT_NUM = 3;

   ```

   查询结果如下：

   ```shell
   +---------+-----------+--------+------------------+---------------+-------+----------------+
   | UNIT_ID | TENANT_ID | STATUS | RESOURCE_POOL_ID | UNIT_GROUP_ID | ZONE  | UNIT_CONFIG_ID |
   +---------+-----------+--------+------------------+---------------+-------+----------------+
   |    1013 |      1006 | ACTIVE |             1002 |          1026 | zone2 |           1001 |
   |    1014 |      1006 | ACTIVE |             1001 |          1024 | zone1 |           1001 |
   |    1015 |      1006 | ACTIVE |             1003 |          1024 | zone3 |           1001 |
   |    1025 |      1006 | ACTIVE |             1001 |          1025 | zone1 |           1001 |
   |    1026 |      1006 | ACTIVE |             1002 |          1027 | zone2 |           1001 |
   |    1027 |      1006 | ACTIVE |             1003 |          1025 | zone3 |           1001 |
   |    1028 |      1006 | ADDING |             1002 |          1028 | zone2 |           1001 |
   +---------+-----------+--------+------------------+---------------+-------+----------------+
   7 rows in set

   ```

   可以看到，待新增的 Unit 为 `ADDING` 状态，待内部均衡完成后，Unit 状态就会从 `ADDING` 状态转为 `ACTIVE` 状态。

   #### 注意

      - OceanBase 数据库在之前的版本（不包含 V4.2.5 版本中，V4.2.5 BP5 版本及其之后的 BP 版本、V4.4.2 及其之后的版本）中，`UNIT_NUM` 扩容为同步过程，在当前版本中，`UNIT_NUM` 扩容变更为异步过程，待新增的 Unit 为 `ADDING` 状态。
      - 扩容过程中（待新增的 Unit 仍为 `ADDING` 状态），支持回滚操作。

       例如，本示例中，可以执行 `ALTER RESOURCE POOL pool2 UNIT_NUM = 2;` 语句将 `UNIT_NUM`改回为原来的值。回滚时，原 `ADDING` 状态的 Unit 直接转变为 `DELETING` 状态。需要注意的是，执行回滚操作时，不支持通过删除指定 Unit 的方式来回滚，系统会自动选择 `ADDING` 状态的 Unit 进行删除。
      - 扩容过程结束前，仅允许执行回滚操作，禁止修改 `UNIT_NUM` 为其他值。
 7. 查看调大 Unit Number 任务的执行状态。

   ```shell
   obclient(root@sys)[oceanbase]> SELECT * FROM oceanbase.DBA_OB_TENANT_JOBS WHERE JOB_TYPE='ALTER_RESOURCE_TENANT_UNIT_NUM' AND TENANT_ID=1006;

   ```

   查询结果如下：

   ```shell
   +--------+--------------------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+-----------------------------------------------------------+-------------------+--------------+-------------+
   | JOB_ID | JOB_TYPE                       | JOB_STATUS | RESULT_CODE | PROGRESS | START_TIME                 | MODIFY_TIME                | TENANT_ID | SQL_TEXT                                                  | EXTRA_INFO        | RS_SVR_IP    | RS_SVR_PORT |
   +--------+--------------------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+-----------------------------------------------------------+-------------------+--------------+-------------+
   |     27 | ALTER_RESOURCE_TENANT_UNIT_NUM | INPROGRESS |        NULL |        0 | 2025-06-18 11:02:52.005261 | 2025-06-18 11:02:52.005261 |      1006 | ALTER RESOURCE POOL pool2 UNIT_NUM = 3                    | new unit num: '3' | 6.xx.xxx.xxx |       29700 |
   +--------+--------------------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+-----------------------------------------------------------+-------------------+--------------+-------------+
   1 row in set

   ```

   ```

   查询结果如下：

   ```

通过上述示例，将租户 `mysql001` 的资源池 `pool2` 的 Unit Number 从 2 变更为 3。变更前租户在每个 Zone 的 Unit 个数为 2；变更后，租户在 `zone1` 和 `zone3` 的 Unit 个数仍为 2，但在 `zon2` 上的 Unit 个数变为 3，从而实现了租户扩容。

## 调小 Unit Number

### 注意事项

在调小租户的 Unit Number 前，需要确认是否开启了 GTS 独占。GTS 独占功能由租户级配置项 [enable_gts_standalone](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005685449) 进行控制，默认值为 `False`，即关闭状态。

如果开启了 GTS 独占，需要注意以下事项：

- 由于 GTS 独占开启后，要求租户下各 Zone 的 `UNIT_NUM` 必须大于或等于 2，如果将租户的任一 Zone 缩容为 `UNIT_NUM` 小于 2，系统会报错。
 - 通过删除指定的 UNIT_LIST 或 Unit Group 来调小 Unit Number 时，不能指定删除 GTS 独占的 Unit 或 Unit Group，否则，系统将会报错。

### 调小租户所有资源池的 Unit Number

对于同构 Zone 模式的租户或异构 Zone 模式的租户，均可以通过 `ALTER RESOURCE TENANT` 语句统一调小租户所有资源池的 Unit Number。下面以调小租户 `mysql001` 所有资源池的 Unit Number 为例来介绍操作方法。

下面以调小租户 `mysql001` 的 Unit Number 为例来介绍操作方法。

   ```shell
   obclient -h172.xxx.xxx.xxx -P2883 -uroot@sys#obdemo -pxxxx -A

   ```

   查询结果如下：

   ```shell
   +-----------+-------------+-------------+--------------------+---------------------------------------------+-------------+----------+-------------------------+
   | TENANT_ID | TENANT_NAME | TENANT_TYPE | PRIMARY_ZONE       | LOCALITY                                    | TENANT_ROLE | UNIT_NUM | ZONE_UNIT_NUM_LIST      |
   +-----------+-------------+-------------+--------------------+---------------------------------------------+-------------+----------+-------------------------+
   |      1006 | mysql001    | USER        | zone1;zone2,zone3  | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | PRIMARY     |        3 | zone1:3,zone2:3,zone3:3 |
   +-----------+-------------+-------------+--------------------+---------------------------------------------+-------------+----------+-------------------------+
   1 row in set

   ```

   查询结果中，租户的 `TENANT_ID` 为 1006，且该租户在各个 Zone 上的 Unit Number 均为 3。
 4. 查看租户 `mysql001` 所拥有的 Unit。

   ```

   查询结果如下：

   ```shell
   +---------+-----------+--------+------------------+---------------+-------+----------------+
   | UNIT_ID | TENANT_ID | STATUS | RESOURCE_POOL_ID | UNIT_GROUP_ID | ZONE  | UNIT_CONFIG_ID |
   +---------+-----------+--------+------------------+---------------+-------+----------------+
   |    1001 |      1006 | ACTIVE |             1001 |          1018 | zone1 |           1001 |
   |    1005 |      1006 | ACTIVE |             1003 |          1018 | zone3 |           1001 |
   |    1006 |      1006 | ACTIVE |             1003 |          1019 | zone3 |           1001 |
   |    1007 |      1006 | ACTIVE |             1002 |          1018 | zone2 |           1001 |
   |    1011 |      1006 | ACTIVE |             1002 |          1019 | zone2 |           1001 |
   |    1012 |      1006 | ACTIVE |             1001 |          1019 | zone1 |           1001 |
   |    1013 |      1006 | ACTIVE |             1002 |          1020 | zone2 |           1001 |
   |    1014 |      1006 | ACTIVE |             1001 |          1020 | zone1 |           1001 |
   |    1015 |      1006 | ACTIVE |             1003 |          1020 | zone3 |           1001 |
   +---------+-----------+--------+------------------+---------------+-------+----------------+
   9 rows in set

   ```

   根据查询结果可知，租户 `mysql001` 的每个 Zone 均有 3 个 Unit。其中，`UNIT_ID` 为 `1001`、`1005`、`1007` 的 `UNIT_GROUP_ID` 相同，均为 `1018`；`UNIT_ID` 为 `1006`、`1011`、`1012` 的 `UNIT_GROUP_ID` 相同，均为 `1019`;`UNIT_ID` 为 `1013`、`1014`、`1015` 的 `UNIT_GROUP_ID` 相同，均为 `1020`。
 5. 把租户 `mysql001` 的 `UNIT_NUM` 修改为 2。

      - 通过随机删除 Unit 的方式来调小 `UNIT_NUM` 的数量。

       对于同构 Zone 模式或异构 Zone 模式的租户，均可以通过以下语句来调小 `UNIT_NUM` 的数量。

       ```

       该语句执行后：

            - 对于同构 Zone 模式的租户，例如，本示例中，租户所有资源池的 `UNIT_NUM` 从 3 修改为 2，系统会随机指定 `UNIT_GROUP_ID` 相同的一组 Unit Group 进行删除。
            - 对于异构 Zone 模式的租户，系统会随机选择一组 UNIT_LIST 进行删除。
      - 通过删除指定 `UNIT_GROUP` 的方式来调小 `UNIT_NUM` 的数量

       对于同构 Zone 模式的租户，还可以通过以下语句来调小 `UNIT_NUM` 的数量，异构 Zone 模式的租户不支持该语句。

       ```shell
       obclient(root@sys)[oceanbase]> ALTER RESOURCE TENANT mysql001 UNIT_NUM = 2 DELETE UNIT_GROUP =(1018);

       ```

       该语句执行后，对于每个 Zone 上 3 个 Unit 的场景，系统会将指定 Unit Group 上的数据重新分布到其他 Unit Group 上后，再删除该 Unit Group。
 6. 命令执行成功后，查看当前 Unit 的状态。

   ```

   查询结果的示例如下：

   ```shell
   +---------+-----------+----------+------------------+---------------+-------+----------------+
   | UNIT_ID | TENANT_ID | STATUS   | RESOURCE_POOL_ID | UNIT_GROUP_ID | ZONE  | UNIT_CONFIG_ID |
   +---------+-----------+----------+------------------+---------------+-------+----------------+
   |    1001 |      1006 | DELETING |             1001 |          1018 | zone1 |           1001 |
   |    1005 |      1006 | DELETING |             1003 |          1018 | zone3 |           1001 |
   |    1006 |      1006 | ACTIVE   |             1003 |          1019 | zone3 |           1001 |
   |    1007 |      1006 | DELETING |             1002 |          1018 | zone2 |           1001 |
   |    1011 |      1006 | ACTIVE   |             1002 |          1019 | zone2 |           1001 |
   |    1012 |      1006 | ACTIVE   |             1001 |          1019 | zone1 |           1001 |
   |    1013 |      1006 | ACTIVE   |             1002 |          1020 | zone2 |           1001 |
   |    1014 |      1006 | ACTIVE   |             1001 |          1020 | zone1 |           1001 |
   |    1015 |      1006 | ACTIVE   |             1003 |          1020 | zone3 |           1001 |
   +---------+-----------+----------+------------------+---------------+-------+----------------+
   9 rows in set

   ```

   可以看到，待删除的 Unit 为 `DELETING` 状态。

   #### 注意

      - 在 OceanBase 数据库中，`UNIT_NUM` 缩容为异步过程。缩容过程中（待删除的 Unit 仍为 `DELETING` 状态），支持回滚操作。

       例如，本示例中，可以执行 `ALTER RESOURCE TENANT mysql001 UNIT_NUM = 3;` 语句将 `UNIT_NUM`改回为原来的值。回滚时，原 `DELETING` 状态的 Unit 将直接转变为 `ADDING` 状态。
      - 缩容过程中，仅支持回滚操作，禁止将 `UNIT_NUM` 修改为其他值。
 7. 查看调小 Unit Number 任务的执行状态。

   ```

   ```shell
   +--------+--------------------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+-----------------------------------------------------------+-------------------+--------------+-------------+
   | JOB_ID | JOB_TYPE                       | JOB_STATUS | RESULT_CODE | PROGRESS | START_TIME                 | MODIFY_TIME                | TENANT_ID | SQL_TEXT                                                  | EXTRA_INFO        | RS_SVR_IP    | RS_SVR_PORT |
   +--------+--------------------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+-----------------------------------------------------------+-------------------+--------------+-------------+
   |     25 | ALTER_RESOURCE_TENANT_UNIT_NUM | SUCCESS    |           0 |      100 | 2025-06-18 10:06:15.648806 | 2025-06-18 10:08:39.969346 |      1006 | alter resource tenant mysql001 unit_num=2                 | new unit num: '2' | 6.xx.xxx.xxx |       29700 |
   +--------+--------------------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+-----------------------------------------------------------+-------------------+--------------+-------------+
   1 row in set

   ```

   当对应任务记录中 `JOB_STATUS` 的值为 `SUCCESS` 时，表示调小 Unit Number 的任务执行成功。

   ```

   查询结果如下：

   ```shell
   +---------+-----------+--------+------------------+---------------+-------+----------------+
   | UNIT_ID | TENANT_ID | STATUS | RESOURCE_POOL_ID | UNIT_GROUP_ID | ZONE  | UNIT_CONFIG_ID |
   +---------+-----------+--------+------------------+---------------+-------+----------------+
   |    1006 |      1006 | ACTIVE |             1003 |          1019 | zone3 |           1001 |
   |    1011 |      1006 | ACTIVE |             1002 |          1019 | zone2 |           1001 |
   |    1012 |      1006 | ACTIVE |             1001 |          1019 | zone1 |           1001 |
   |    1013 |      1006 | ACTIVE |             1002 |          1020 | zone2 |           1001 |
   |    1014 |      1006 | ACTIVE |             1001 |          1020 | zone1 |           1001 |
   |    1015 |      1006 | ACTIVE |             1003 |          1020 | zone3 |           1001 |
   +---------+-----------+--------+------------------+---------------+------+-----------------+
   6 rows in set

   ```

通过上述示例，将租户 `mysql001`所有资源池的 Unit Number 从 3 变更为 2。变更前，租户在每个 Zone 的 Unit 个数为 3；变更后租户在每个 Zone 的 Unit 个数为 2，从而实现了租户缩容。

### 调小租户单个资源池的 Unit Number

对于异构 Zone 模式的租户，如果有多个资源池，还可以通过 `ALTER RESOURCE POOL` 语句单独调小租户某个资源池的 Unit Number。同构 Zone 模式租户不支持该方式。

下面以调小租户 `mysql001` 的其中一个资源池 `pool2` 的 Unit Number 为例来介绍操作方法。

   ```

   查询结果如下：

   ```

   ```

   查询结果如下：

   ```

   根据查询结果可知，租户 `mysql001` 有 `pool1`、`pool2`、`pool3` 共 3 个资源池，分别分布在 `zone1`、`zone2` 和 `zone3` 上。
 5. 查看租户 `mysql001` 的 Unit 信息。

   ```

   查询结果如下：

   ```
 6. 根据实际需求，将租户 `mysql001` 的资源池 `pool2` 的 `UNIT_NUM` 修改为 1。

      - 通过随机删除 Unit 的方式来调小 `UNIT_NUM` 的数量

       ```shell
       obclient(root@sys)[oceanbase]> ALTER RESOURCE POOL pool2 UNIT_NUM = 1;

       ```
      - 通过删除指定 Unit 的方式来调小 `UNIT_NUM` 的数量

       ```shell
       obclient(root@sys)[oceanbase]> ALTER RESOURCE POOL pool2 UNIT_NUM = 1 DELETE UNIT=(1011);

       ```
 7. 命令执行成功后，查看当前 Unit 的状态。

   ```

   查询结果如下：

   ```shell
   +---------+-----------+----------+------------------+---------------+-------+----------------+
   | UNIT_ID | TENANT_ID | STATUS   | RESOURCE_POOL_ID | UNIT_GROUP_ID | ZONE  | UNIT_CONFIG_ID |
   +---------+-----------+----------+------------------+---------------+-------+----------------+
   |    1006 |      1006 | ACTIVE   |             1003 |          1019 | zone3 |           1001 |
   |    1011 |      1006 | DELETING |             1002 |          1019 | zone2 |           1001 |
   |    1012 |      1006 | ACTIVE   |             1001 |          1019 | zone1 |           1001 |
   |    1013 |      1006 | ACTIVE   |             1002 |          1020 | zone2 |           1001 |
   |    1014 |      1006 | ACTIVE   |             1001 |          1020 | zone1 |           1001 |
   |    1015 |      1006 | ACTIVE   |             1003 |          1020 | zone3 |           1001 |
   +---------+-----------+----------+------------------+---------------+------+-----------------+
   6 rows in set

   ```

       例如，本示例中可以执行 `ALTER RESOURCE POOL pool2 UNIT_NUM = 2;` 语句将 `UNIT_NUM`改回为原来的值。回滚时，原 `DELETING` 状态的 Unit 将直接转变为 `ADDING` 状态。
      - 缩容过程中，仅支持回滚操作，禁止将 `UNIT_NUM` 修改为其他值。
 8. 查看调小 Unit Number 任务的执行状态。

   ```

   查询结果如下：

   ```shell
   +--------+--------------------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+-----------------------------------------------------------+-------------------+--------------+-------------+
   | JOB_ID | JOB_TYPE                       | JOB_STATUS | RESULT_CODE | PROGRESS | START_TIME                 | MODIFY_TIME                | TENANT_ID | SQL_TEXT                                                  | EXTRA_INFO        | RS_SVR_IP    | RS_SVR_PORT |
   +--------+--------------------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+-----------------------------------------------------------+-------------------+--------------+-------------+
   |     24 | ALTER_RESOURCE_TENANT_UNIT_NUM | SUCCESS    |           0 |      100 | 2025-06-18 09:39:34.319331 | 2025-06-18 09:40:30.439822 |      1006 | alter resource pool pool2 unit_num=1                      | new unit num: '1' | 6.xx.xxx.xxx |       29700 |
   +--------+--------------------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+-----------------------------------------------------------+-------------------+--------------+-------------+
   1 row in set

   ```

   有关视图 `DBA_OB_TENANT_JOBS` 的详细字段说明，请参见 [DBA_OB_TENANT_JOBS](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005684078)。
 9. 查看租户 `mysql001` 修改后的 Unit。

   ```

   查询结果如下：

   ```shell
   +---------+-----------+----------+------------------+---------------+-------+----------------+
   | UNIT_ID | TENANT_ID | STATUS   | RESOURCE_POOL_ID | UNIT_GROUP_ID | ZONE  | UNIT_CONFIG_ID |
   +---------+-----------+----------+------------------+---------------+-------+----------------+
   |    1006 |      1006 | ACTIVE   |             1003 |          1019 | zone3 |           1001 |
   |    1012 |      1006 | ACTIVE   |             1001 |          1019 | zone1 |           1001 |
   |    1013 |      1006 | ACTIVE   |             1002 |          1021 | zone2 |           1001 |
   |    1014 |      1006 | ACTIVE   |             1001 |          1020 | zone1 |           1001 |
   |    1015 |      1006 | ACTIVE   |             1003 |          1020 | zone3 |           1001 |
   +---------+-----------+----------+------------------+---------------+------+-----------------+
   5 rows in set

   ```

通过上述示例，将租户 `mysql001` 的资源池 `pool2` 的 Unit Number 从 2 变更为 1。变更前，租户在每个 Zone 的 Unit 个数为 2；变更后，租户在 `zone1` 和 `zone3` 的 Unit 个数仍为 2，但在 `zon2` 上的 Unit 个数变为 1，从而实现了租户缩容。

## 相关文档

- [租户扩缩容介绍](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005682935)

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