首批通过分布式安全可靠测评,为关键业务系统打造
通过调整 Unit Number 实现租户扩缩容
更新时间:2026-04-30 19:06:39
租户扩容和缩容本质上是提高和降低租户的服务能力,包括计算能力和存储容量。可以通过提高单节点的服务能力达成,也可以通过增加服务节点达成。本文介绍如何通过修改 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在系统租户下用于控制是否进行租户间的负载均衡,在用户租户下用于控制是否进行租户内均衡。对租户进行扩缩容操作时,需要开启租户内的均衡。有关租户间均衡策略与租户内均衡策略的详细介绍,参见 数据负载均衡最佳实践。该配置项的默认值为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 功能
ALTER SYSTEM SET enable_rebalance = true TENANT = 'tenant_name';ALTER SYSTEM SET enable_transfer = true TENANT = 'tenant_name';以上语句表示仅指定租户下的配置项
enable_rebalance和enable_transfer的值为true。系统租户开启所有用户租户(不含
sys租户和 Meta 租户)的租户内负载均衡和租户下的 Transfer 功能ALTER SYSTEM SET enable_rebalance = true TENANT = all_user;ALTER SYSTEM SET enable_transfer = true TENANT = all_user;或者
ALTER SYSTEM SET enable_rebalance = true TENANT = all;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 功能的语句如下:
ALTER SYSTEM SET enable_rebalance = true;ALTER SYSTEM SET enable_transfer = true;Oracle 租户开启本租户的租户内负载均衡和租户下的 Transfer 功能的语句如下:
ALTER SYSTEM SET enable_rebalance = 'true';ALTER SYSTEM SET enable_transfer = 'true';
更多配置项
enable_rebalance和enable_transfer的详细说明,请参见 enable_rebalance 和 enable_transfer。由于空闲的资源池会被计算为占用的资源,故在扩容前,如果有租户被删除,建议与租户对应的资源池也一并删除,以便释放资源。
删除资源池的相关操作,参见 删除资源池。
进行租户缩容前,建议进行一轮转储以便释放租户正在使用的内存。
手动触发转储的相关操作,参见 手动触发转储。
执行租户扩缩容操作前,建议先进行租户的资源规划,以便更好地达到预期效果。
有关租户扩缩容资源规划的详细操作,参见租户扩缩容资源规划。
注意事项
通过调整 Unit Number 来进行租户的扩缩容时,需要注意以下事项:
扩缩容过程中,禁止修改租户的 Locality。
扩缩容过程中,禁止扩大租户资源池的
ZONE_LIST范围。扩缩容过程中,禁止为租户添加新的资源池。
扩缩容过程中,禁止合并资源池。
扩缩容过程中,禁止对
DELETING状态的 Unit 执行迁移操作。
调大 Unit Number
调大租户所有资源池的 Unit Number
对于同构 Zone 模式的租户或异构 Zone 模式的租户,均可以通过 ALTER RESOURCE TENANT 语句统一调大租户所有资源池的 Unit Number。下面以调大租户 mysql001 所有资源池的 Unit Number 为例来介绍操作方法。
使用
root用户登录到集群的sys租户。obclient -h172.30.xxx.xxx -P2883 -uroot@sys#obdemo -pxxxx -A进入
oceanbase数据库。obclient(root@sys)[(none)]> use oceanbase;查看租户
mysql001信息,获取其TENANT_ID。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';查询结果如下:
+-----------+-------------+-------------+--------------------+---------------------------------------------+-------------+----------+-------------------------+ | 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。查看租户
mysql001所拥有的 Unit。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;查询结果如下:
+---------+-----------+--------+------------------+---------------+-------+----------------+ | 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相同。把租户
mysql001的UNIT_NUM修改为 2。obclient(root@sys)[oceanbase]> ALTER RESOURCE TENANT mysql001 UNIT_NUM = 2;命令执行成功后,查看当前 Unit 的状态。
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;查询结果如下:
+---------+-----------+--------+------------------+---------------+-------+----------------+ | 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为其他值。
- OceanBase 数据库在之前的版本(不包含 V4.2.5 版本中,V4.2.5 BP5 版本及其之后的 BP 版本、V4.4.2 及其之后的版本)中,
查看调大 Unit Number 任务的执行状态。
obclient(root@sys)[oceanbase]> SELECT * FROM oceanbase.DBA_OB_TENANT_JOBS WHERE JOB_TYPE = 'ALTER_RESOURCE_TENANT_UNIT_NUM' AND TENANT_ID=1006;查询结果如下:
+--------+--------------------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+-----------------------------------------------------------+-------------------+--------------+-------------+ | 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。查看租户
mysql001修改后的 Unit。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;查询结果如下:
+---------+-----------+--------+------------------+---------------+-------+----------------+ | 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 为例来介绍操作方法。
使用
root用户登录到集群的sys租户。obclient -h172.30.xxx.xxx -P2883 -uroot@sys#obdemo -pxxxx -A进入
oceanbase数据库。obclient(root@sys)[(none)]> use oceanbase;查看租户
mysql001信息,获取其TENANT_ID。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';查询结果如下:
+-----------+-------------+-------------+--------------------+---------------------------------------------+-------------+----------+-------------------------+ | 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。查看当前租户的资源配置信息。
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;查询结果如下:
+-----------+-------------+------------------+-----------+---------------+ | 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上。根据实际需求,将租户
mysql001的资源池pool2的UNIT_NUM修改为 3。obclient(root@sys)[oceanbase]> ALTER RESOURCE POOL pool2 UNIT_NUM = 3;命令执行成功后,查看当前 Unit 的状态。
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;查询结果如下:
+---------+-----------+--------+------------------+---------------+-------+----------------+ | 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为其他值。
- OceanBase 数据库在之前的版本(不包含 V4.2.5 版本中,V4.2.5 BP5 版本及其之后的 BP 版本、V4.4.2 及其之后的版本)中,
查看调大 Unit Number 任务的执行状态。
obclient(root@sys)[oceanbase]> SELECT * FROM oceanbase.DBA_OB_TENANT_JOBS WHERE JOB_TYPE='ALTER_RESOURCE_TENANT_UNIT_NUM' AND TENANT_ID=1006;查询结果如下:
+--------+--------------------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+-----------------------------------------------------------+-------------------+--------------+-------------+ | 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查询结果中,根据以下字段,找到对应的任务记录:
START_TIME:任务的发起时间。SQL_TEXT:任务对应的 SQL 语句。EXTRA_INFO:变更前后的 Unit Number 数。
当对应变更记录中
JOB_STATUS的值为SUCCESS时,表示调大 Unit Number 的任务执行成功。有关视图
DBA_OB_TENANT_JOBS的详细字段说明,请参见 DBA_OB_TENANT_JOBS。查看租户
mysql001修改后的 Unit。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;查询结果如下:
+---------+-----------+--------+------------------+---------------+-------+----------------+ | 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
通过上述示例,将租户 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 进行控制,默认值为 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 为例来介绍操作方法。
使用
root用户登录到集群的sys租户。obclient -h172.xxx.xxx.xxx -P2883 -uroot@sys#obdemo -pxxxx -A进入
oceanbase数据库。obclient(root@sys)[(none)]> use oceanbase;查看租户
mysql001信息,获取其TENANT_ID。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';查询结果如下:
+-----------+-------------+-------------+--------------------+---------------------------------------------+-------------+----------+-------------------------+ | 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。查看租户
mysql001所拥有的 Unit。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;查询结果如下:
+---------+-----------+--------+------------------+---------------+-------+----------------+ | 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。把租户
mysql001的UNIT_NUM修改为 2。通过随机删除 Unit 的方式来调小
UNIT_NUM的数量。对于同构 Zone 模式或异构 Zone 模式的租户,均可以通过以下语句来调小
UNIT_NUM的数量。obclient(root@sys)[oceanbase]> ALTER RESOURCE TENANT mysql001 UNIT_NUM = 2;该语句执行后:
对于同构 Zone 模式的租户,例如,本示例中,租户所有资源池的
UNIT_NUM从 3 修改为 2,系统会随机指定UNIT_GROUP_ID相同的一组 Unit Group 进行删除。对于异构 Zone 模式的租户,系统会随机选择一组 UNIT_LIST 进行删除。
通过删除指定
UNIT_GROUP的方式来调小UNIT_NUM的数量对于同构 Zone 模式的租户,还可以通过以下语句来调小
UNIT_NUM的数量,异构 Zone 模式的租户不支持该语句。obclient(root@sys)[oceanbase]> ALTER RESOURCE TENANT mysql001 UNIT_NUM = 2 DELETE UNIT_GROUP =(1018);该语句执行后,对于每个 Zone 上 3 个 Unit 的场景,系统会将指定 Unit Group 上的数据重新分布到其他 Unit Group 上后,再删除该 Unit Group。
命令执行成功后,查看当前 Unit 的状态。
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;查询结果的示例如下:
+---------+-----------+----------+------------------+---------------+-------+----------------+ | 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修改为其他值。
- 在 OceanBase 数据库中,
查看调小 Unit Number 任务的执行状态。
obclient(root@sys)[oceanbase]> SELECT * FROM oceanbase.DBA_OB_TENANT_JOBS WHERE JOB_TYPE='ALTER_RESOURCE_TENANT_UNIT_NUM' AND TENANT_ID=1006;查询结果的示例如下:
+--------+--------------------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+-----------------------------------------------------------+-------------------+--------------+-------------+ | 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查询结果中,根据以下字段,找到对应的任务记录:
START_TIME:任务的发起时间。SQL_TEXT:任务对应的 SQL 语句。EXTRA_INFO:变更前后的 Unit Number 数。
当对应任务记录中
JOB_STATUS的值为SUCCESS时,表示调小 Unit Number 的任务执行成功。有关视图
DBA_OB_TENANT_JOBS的详细字段说明,请参见 DBA_OB_TENANT_JOBS。查看租户
mysql001修改后的 Unit。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;查询结果如下:
+---------+-----------+--------+------------------+---------------+-------+----------------+ | 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 为例来介绍操作方法。
使用
root用户登录到集群的sys租户。obclient -h172.30.xxx.xxx -P2883 -uroot@sys#obdemo -pxxxx -A进入
oceanbase数据库。obclient(root@sys)[(none)]> use oceanbase;查看租户
mysql001信息,获取其TENANT_ID。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';查询结果如下:
+-----------+-------------+-------------+--------------------+---------------------------------------------+-------------+----------+-------------------------+ | 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。查看当前租户的资源配置信息。
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;查询结果如下:
+-----------+-------------+------------------+-----------+---------------+ | 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上。查看租户
mysql001的 Unit 信息。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;查询结果如下:
+---------+-----------+--------+------------------+---------------+-------+----------------+ | 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的资源池pool2的UNIT_NUM修改为 1。通过随机删除 Unit 的方式来调小
UNIT_NUM的数量obclient(root@sys)[oceanbase]> ALTER RESOURCE POOL pool2 UNIT_NUM = 1;通过删除指定 Unit 的方式来调小
UNIT_NUM的数量obclient(root@sys)[oceanbase]> ALTER RESOURCE POOL pool2 UNIT_NUM = 1 DELETE UNIT=(1011);
命令执行成功后,查看当前 Unit 的状态。
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;查询结果如下:
+---------+-----------+----------+------------------+---------------+-------+----------------+ | 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可以看到,待删除的 Unit 为
DELETING状态。注意
- 在 OceanBase 数据库中,
UNIT_NUM缩容为异步过程。缩容过程中(待删除的 Unit 仍为DELETING状态),支持回滚操作。例如,本示例中可以执行
ALTER RESOURCE POOL pool2 UNIT_NUM = 2;语句将UNIT_NUM改回为原来的值。回滚时,原DELETING状态的 Unit 将直接转变为ADDING状态。 - 缩容过程中,仅支持回滚操作,禁止将
UNIT_NUM修改为其他值。
- 在 OceanBase 数据库中,
查看调小 Unit Number 任务的执行状态。
obclient(root@sys)[oceanbase]> SELECT * FROM oceanbase.DBA_OB_TENANT_JOBS WHERE JOB_TYPE='ALTER_RESOURCE_TENANT_UNIT_NUM' AND TENANT_ID=1006;查询结果如下:
+--------+--------------------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+-----------------------------------------------------------+-------------------+--------------+-------------+ | 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查询结果中,根据以下字段,找到对应的任务记录:
START_TIME:任务的发起时间。SQL_TEXT:任务对应的 SQL 语句。EXTRA_INFO:变更前后的 Unit Number 数。
当对应变更记录中
JOB_STATUS的值为SUCCESS时,表示调大 Unit Number 的任务执行成功。有关视图
DBA_OB_TENANT_JOBS的详细字段说明,请参见 DBA_OB_TENANT_JOBS。查看租户
mysql001修改后的 Unit。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;查询结果如下:
+---------+-----------+----------+------------------+---------------+-------+----------------+ | 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,从而实现了租户缩容。