集群中创建 MySQL 租户

创建 MySQL 租户

OceanBase 集群支持 MySQL 模式和 Oracle 模式的租户租户可以理解 为 MySQL 或 Oracle 等传统数据库中的实例 ,一个租户相当于一个实例。租户通过资源池与资源关联,从而独占一定的资源配额可以动态调整资源配额在租户下可以创建 Database(MySQL 模式)、用户、表等数据库对象

创建租户的流程

OceanBase 数据库仅支持创建用户租户,系统租户由集群创建时自动创建 。创建用户租户是一系列操作的组合,首先创建资源规格 ,然后基于该资源规格创建资源池 ,最后创建租户并指定其资源池 。所以创建租户的顺序为:资源规格 → 资源池 → 租户。

注意事项

  • 创建租户前需要做好资源规划。
  • OceanBase 数据库支持两种类型的租户,MySQL 兼容模式和 Oracle 兼容模式。

创建资源规格的步骤

资源规格是对 CPU、内存、磁盘空间、IOPS 等资源项进行的定义。

可以通过 CREATE RESOURCE UNIT 语句,创建资源规格。

连接集群

使用 root 用户登录 obcluster 集群的 sys 租户。

obclient -h127.0.0.1 -P2883 -uroot@sys#obcluster -Doceanbase -A

获取已有的资源规格信息

通过 DBA_OB_UNIT_CONFIGS 视图,获取已有的资源规格信息。

SELECT * FROM DBA_OB_UNIT_CONFIGS;

输出结果如下:

+----------------+-----------------+----------------------------+----------------------------+---------+---------+-------------+---------------+---------------------+---------------------+-------------+
| UNIT_CONFIG_ID | NAME            | CREATE_TIME                | MODIFY_TIME                | MAX_CPU | MIN_CPU | MEMORY_SIZE | LOG_DISK_SIZE | MAX_IOPS            | MIN_IOPS            | IOPS_WEIGHT |
+----------------+-----------------+----------------------------+----------------------------+---------+---------+-------------+---------------+---------------------+---------------------+-------------+
|              1 | sys_unit_config | 2025-06-16 17:12:20.916675 | 2025-06-16 17:12:20.916675 |       3 |       3 |  2147483648 |    2147483648 | 9223372036854775807 | 9223372036854775807 |           3 |
+----------------+-----------------+----------------------------+----------------------------+---------+---------+-------------+---------------+---------------------+---------------------+-------------+
1 row in set (0.028 sec)

从上述查询结果可以看出,系统默认创建一个名为 sys_unit_config 的 unit,默认最大和最小可使用 CPU 为 3C,内存大小为 2147483648/1024/1024/1024 = 2G,日志盘大小为 2147483648/1024/1024/1024 = 2G。

创建资源规格

通过 CREATE RESOURCE UNIT 语句 ,创建资源规格。示例:

创建一个名称为 s1_unit_config 的资源规格,其资源配置为 CPU 为 1 核,内存 2G,日志盘空间 6G。

CREATE RESOURCE UNIT s1_unit_config
                MEMORY_SIZE = '2G',
                MAX_CPU = 1, MIN_CPU = 1,
                LOG_DISK_SIZE = '6G',
                MAX_IOPS = 10000, MIN_IOPS = 10000, IOPS_WEIGHT=1;

参数说明:

  • 创建资源规格时,MAX_CPU 和 MEMORY_SIZE 必选
  • unit_name :资源规格名称。
  • MAX_CPU :CPU 规格上限,MIN_CPU 是 CPU 规格下限,单位是核数。如果用户没有指定 MIN_CPU默认等于 MAX_CPU
  • MIN_CPU :最小的 CPU 规格,所有租户的 MIN_CPU 的总和不能超过该节点 CPU 总容量 CPU_CAPACITY
  • MEMORY_SIZE :内存规格,最小为 1G。OceanBase 数据库 V4.0 开始不支持内存超卖
  • LOG_DISK_SIZE :日志盘空间,OceanBase 数据库 V4.0 会按租户管理日志盘空间 ,系统为各个租户预留日志盘空间,实现按租户隔离 。当用户没有指定 时,LOG_DISK_SIZE 默认值是内存规格的 3 倍大小最小为 2G
  • OceanBase 数据库 V4.0 支持租户间 IOPS 隔离,通过 MAX_IOPS MIN_IOPS IOPS_WEIGHT 三个参数决定IOPS 规格参数默认不需要指定,系统根据 CPU 规格自动计算

确认资源规格创建成功

查询 DBA_OB_UNIT_CONFIGS 视图 ,确认资源规格创建成功。

SELECT * FROM DBA_OB_UNIT_CONFIGS WHERE NAME = 's1_unit_config';

输出结果如下:

+----------------+----------------+----------------------------+----------------------------+---------+---------+-------------+---------------+----------+----------+-------------+
| UNIT_CONFIG_ID | NAME           | CREATE_TIME                | MODIFY_TIME                | MAX_CPU | MIN_CPU | MEMORY_SIZE | LOG_DISK_SIZE | MAX_IOPS | MIN_IOPS | IOPS_WEIGHT |
+----------------+----------------+----------------------------+----------------------------+---------+---------+-------------+---------------+----------+----------+-------------+
|           1001 | s1_unit_config | 2025-09-18 16:37:25.957429 | 2025-09-18 16:37:25.957429 |       1 |       1 |  2147483648 |    6442450944 |    10000 |    10000 |           1 |
+----------------+----------------+----------------------------+----------------------------+---------+---------+-------------+---------------+----------+----------+-------------+
1 row in set (0.003 sec)

创建资源池的步骤

创建资源规格后,可以在创建资源池时指定资源规格,从而使用相应大小的资源单元,并最终分配给相应的租户。

可以通过 CREATE RESOURCE POOL 语句,创建资源池。

注意事项:确认集群是否有足够的可用资源来创建资源池。

获取资源池的配置信息

创建资源规格后,通过 DBA_OB_RESOURCE_POOLS 视图 ,获取资源池的配置信息。

SELECT * FROM DBA_OB_RESOURCE_POOLS;

输出结果如下:

+------------------+----------+-----------+----------------------------+----------------------------+------------+----------------+-------------------+--------------+
| RESOURCE_POOL_ID | NAME     | TENANT_ID | CREATE_TIME                | MODIFY_TIME                | UNIT_COUNT | UNIT_CONFIG_ID | ZONE_LIST         | REPLICA_TYPE |
+------------------+----------+-----------+----------------------------+----------------------------+------------+----------------+-------------------+--------------+
|                1 | sys_pool |         1 | 2025-06-16 17:12:20.920342 | 2025-06-16 17:12:20.930196 |          1 |              1 | zone1;zone2;zone3 | FULL         |
+------------------+----------+-----------+----------------------------+----------------------------+------------+----------------+-------------------+--------------+
1 row in set (0.028 sec)

创建资源池

通过 CREATE RESOURCE POOL 语句 ,创建资源池。

要求:创建一个名为 mq_pool_01 的资源池,在 Zone1 里各创建 1 个 Unit,每个 Unit 的资源规格为 s1_unit_config

CREATE RESOURCE POOL mq_pool_01 
                UNIT='s1_unit_config', 
                UNIT_NUM=1; 

参数说明:

  • UNIT :该资源池的资源规格。这里注意,创建时,系统识别资源规格名字大小写,但是在直接查询相关视图时会把名字统一转换为小写。
  • UNIT_NUM :该资源池在目标 Zone 的 Unit 个数,它的值要小于目标 Zone 的节点个数,且每个节点上最多只能分布同一个租户的一个 Unit。

确认资源池创建成功

查询 DBA_OB_RESOURCE_POOLS 视图,确认资源池创建成功。

SELECT * FROM DBA_OB_RESOURCE_POOLS WHERE NAME = 'mq_pool_01';

输出结果如下:

+------------------+------------+-----------+----------------------------+----------------------------+------------+----------------+-------------------+--------------+
| RESOURCE_POOL_ID | NAME       | TENANT_ID | CREATE_TIME                | MODIFY_TIME                | UNIT_COUNT | UNIT_CONFIG_ID | ZONE_LIST         | REPLICA_TYPE |
+------------------+------------+-----------+----------------------------+----------------------------+------------+----------------+-------------------+--------------+
|             1001 | mq_pool_01 |      NULL | 2025-09-18 16:45:58.869155 | 2025-09-18 16:45:58.869155 |          1 |           1001 | zone1;zone2;zone3 | FULL         |
+------------------+------------+-----------+----------------------------+----------------------------+------------+----------------+-------------------+--------------+
1 row in set (0.003 sec)

创建租户的步骤

资源池创建后,将资源池分配给租户。

通过 CREATE TENANT 语句,创建租户。

查看所有的租户信息

创建资源池后,通过 DBA_OB_TENANTS 视图,查看所有的租户信息。

SELECT * FROM DBA_OB_TENANTS;

输出如下:

+-----------+-------------+-------------+----------------------------+----------------------------+--------------+---------------------------------------------+-------------------+--------------------+--------+---------------+--------+-------------+-------------------+------------------+----------+----------------+--------------+--------------------+--------------+----------------------------+----------+------------+-----------+
| TENANT_ID | TENANT_NAME | TENANT_TYPE | CREATE_TIME                | MODIFY_TIME                | PRIMARY_ZONE | LOCALITY                                    | PREVIOUS_LOCALITY | COMPATIBILITY_MODE | STATUS | IN_RECYCLEBIN | LOCKED | TENANT_ROLE | SWITCHOVER_STATUS | SWITCHOVER_EPOCH | SYNC_SCN | REPLAYABLE_SCN | READABLE_SCN | RECOVERY_UNTIL_SCN | LOG_MODE     | ARBITRATION_SERVICE_STATUS | UNIT_NUM | COMPATIBLE | MAX_LS_ID |
+-----------+-------------+-------------+----------------------------+----------------------------+--------------+---------------------------------------------+-------------------+--------------------+--------+---------------+--------+-------------+-------------------+------------------+----------+----------------+--------------+--------------------+--------------+----------------------------+----------+------------+-----------+
|         1 | sys         | SYS         | 2025-06-16 17:12:20.944405 | 2025-06-16 17:12:20.944405 | RANDOM       | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | NULL              | MYSQL              | NORMAL | NO            | NO     | PRIMARY     | NORMAL            |                0 |     NULL |           NULL |         NULL |               NULL | NOARCHIVELOG | DISABLED                   |        1 | 4.3.1.0    |         1 |
+-----------+-------------+-------------+----------------------------+----------------------------+--------------+---------------------------------------------+-------------------+--------------------+--------+---------------+--------+-------------+-------------------+------------------+----------+----------------+--------------+--------------------+--------------+----------------------------+----------+------------+-----------+
1 row in set (0.034 sec)

创建租户

通过 CREATE TENANT 语句,创建一个名为 mq_t1 的 MySQL 租户,副本数为 3,资源池指定为 mq_pool_01 ,Primary Zone 为 zone1;zone2;zone3 ,允许所有 IP 连接数据库。

CREATE TENANT IF NOT EXISTS mq_t1 
        PRIMARY_ZONE='zone1', 
        RESOURCE_POOL_LIST=('mq_pool_01')
        set OB_TCP_INVITED_NODES='%';

参数说明:

  • IF NOT EXISTS :可选参数,如果要创建的租户名已存在,并且没有指定 IF NOT EXISTS,则会出现错误。
  • tenant_name :指定租户名称。租户名不能是 OceanBase 数据库的关键字。
  • PRIMARY_ZONE :指定租户的 Primary Zone。
  • RESOURCE_POOL_LIST :指定分配给租户的资源池列表**,必填** 。如果有多个资源池,要求多个资源池的 UNIT_NUM 个数一致
  • OB_TCP_INVITED_NODES用于指定租户连接的白名单,即允许哪些客户端 IP 连接该租户 。示例中 % 表示所有客户端都可登录,如果不显式指定 OB_TCP_INVITED_NODES 的值,则默认租户的连接方式为只允许本机的 IP 登录该租户。

确认租户创建成功

DBA_OB_TENANTS 视图,确认租户创建成功

SELECT * FROM DBA_OB_TENANTS WHERE TENANT_NAME = 'mq_t1' ;

输出结果如下:

+-----------+-------------+-------------+----------------------------+----------------------------+-------------------+---------------------------------------------+-------------------+--------------------+--------+---------------+--------+-------------+-------------------+------------------+---------------------+---------------------+---------------------+---------------------+--------------+----------------------------+----------+------------+-----------+
| TENANT_ID | TENANT_NAME | TENANT_TYPE | CREATE_TIME                | MODIFY_TIME                | PRIMARY_ZONE      | LOCALITY                                    | PREVIOUS_LOCALITY | COMPATIBILITY_MODE | STATUS | IN_RECYCLEBIN | LOCKED | TENANT_ROLE | SWITCHOVER_STATUS | SWITCHOVER_EPOCH | SYNC_SCN            | REPLAYABLE_SCN      | READABLE_SCN        | RECOVERY_UNTIL_SCN  | LOG_MODE     | ARBITRATION_SERVICE_STATUS | UNIT_NUM | COMPATIBLE | MAX_LS_ID |
+-----------+-------------+-------------+----------------------------+----------------------------+-------------------+---------------------------------------------+-------------------+--------------------+--------+---------------+--------+-------------+-------------------+------------------+---------------------+---------------------+---------------------+---------------------+--------------+----------------------------+----------+------------+-----------+
|      1002 | mq_t1       | USER        | 2025-09-18 16:49:24.373641 | 2025-09-18 16:49:50.136963 | zone1;zone2,zone3 | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | NULL              | MYSQL              | NORMAL | NO            | NO     | PRIMARY     | NORMAL            |                0 | 1758185468121313003 | 1758185468121313003 | 1758185468121313003 | 4611686018427387903 | NOARCHIVELOG | DISABLED                   |        1 | 4.3.1.0    |      1001 |
+-----------+-------------+-------------+----------------------------+----------------------------+-------------------+---------------------------------------------+-------------------+--------------------+--------+---------------+--------+-------------+-------------------+------------------+---------------------+---------------------+---------------------+---------------------+--------------+----------------------------+----------+------------+-----------+
1 row in set (0.021 sec)

登录新创建的租户进行使用

租户创建成功后,退出当前连接,尝试登录新创建的租户进行使用。

默认管理员用户(MySQL 模式为 root)的密码为空 ,您需要及时修改管理员用户的密码。

执行 exit 退出集群后,使用新创建的租户登录集群。使用 root 用户登录 obcluster 集群的 MySQL 模式租户 mq_t1

[admin@xxx ~]obclient -h127.0.0.1 -P2883 -uroot@mq_t1#obcluster -Doceanbase -A

执行以下语句修改用户密码,这里以 root 用户为例。

ALTER USER root IDENTIFIED BY '0123456789';

管理员用户密码修改成功后,执行 exit 退出集群后,重新登录新创建的租户。

[admin@xxx ~]obclient -h127.0.0.1 -P2883 -uroot@mq_t1#obcluster -p0123456789 -A
3 个赞

谢谢分享,学习了

谢谢分享

步骤很详细的教程