暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

OceanBase数据库租户常见操作——创建租户

Tonyhacks 2023-11-08
761

创建租户

OceanBase 数据库是原生分布式数据库,在同一个数据库中可以同时运行多个数据库实例,第一步往往需要创建一个租户(数据库实例),然后像使用传统单机数据库那样使用数据库实例。本文介绍如何创建租户。

创建租户的流程

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

  1. 创建资源规格:创建资源规格仅仅是规格定义,不实际分配资源,可以通过 DBA_OB_UNIT_CONFIGS 视图查看所有资源规格。资源规格可以复用,可以建议根据业务场景抽象若干不同规格,例如小规格、中规格、大规格等,从而降低运维复杂度。但在租户资源不足需要应急扩容时,不能直接调整原规格,需要新建资源规格,或者直接更换更大一级的资源规格。
  2. 创建资源池:创建资源池时会实际创建 Unit,按照规格定义分配资源,如对应节点预留资源不够将会创建失败,通过 GV$OB_SERVERS 视图可以查看所有节点资源分配信息。如果创建成功可以通过 DBA_OB_RESOURCE_POOLS 视图和 DBA_OB_UNITS 视图查看资源池及其对应 Unit。资源池不能复用,成功创建租户后指定资源池将会分配给租户。
  3. 创建租户:创建租户时通过指定 RESOURCE_POOL_LIST 将资源池分配给租户,可以通过 DBA_OB_TENANTS 视图查看所有租户。可以每个 Zone 一个资源池,使用独立的资源规格。也可以所有 Zone 使用同一个资源池,从而所有 Zone 使用同一个资源规格。除了资源池列表,还有兼容模式、Primary Zone、Locality、连接白名单等其他重要属性和系统变量,其中资源池列表为创建租户时的必填项。新建租户 Root 用户密码为空,使用前请先设置密码。

资源规划

创建租户前需要做好资源规划,创建租户后再调整可能会非常麻烦。做好资源规划的前提是深入理解业务场景,从而更多的参与到业务数据库架构设计中去。

资源规划有如下注意事项:

  • 每个节点需要预留一定的资源,备用于租户容量不足需要紧急扩容的情况。

  • 对于大量写入的业务,需要设置较大的内存和日志盘规格。对于大量消耗 CPU 资源的业务,需要错落分布于不同节点,以避免节点负载不均衡,甚至造成热点节点并影响业务。

  • 集群配置项 resource_hard_limit 定义了 CPU 资源的超卖百分比,又被称为“超卖配置项”,OceanBase 数据库仅支持 CPU 超卖,不支持其他资源的超卖。CPU 超卖适用于同一集群中不同租户间峰值错峰的场景,从而提高整体资源使用率。如果租户间峰值同时出现,开启 CPU 超卖可能导致租户之间 CPU 资源的互相抢占,互相影响。

  • Unit 的资源规格不能超过单节点的总可分配资源,对于单 Unit 租户(资源池的 UNIT_NUM=1)如果出现容量瓶颈,除了更换更大规格的服务器,还可以将租户水平扩展为多 Unit,从而利用多节点的资源。多 Unit 租户需要认真设计业务数据在 Unit 间的分布,以避免分布式事务对性能的损耗。如果预计业务量会突破单机容量上限,需要提前做好数据分片的设计,数据分片需要尽量避免分布式事务。

    从传统数据库迁移到 OceanBase 数据库的业务,为了迁移的平滑性往往采用对等架构,即采用单 Unit 租户的设计方案,以保证业务访问数据库时依然仅需要访问单节点。当随着业务量增加达到单机容量上限后,可以扩展为多 Unit 租户,按照业务场景将业务数据拆分为多组。每组业务数据放置于一个 Unit 内,保证每个业务的数据库访问不跨机,从而在零性能损耗的情况下实现水平扩容。这也是 OceanBase 数据库相比于传统数据库的架构优势之一,易用的水平扩展性,可以轻松突破单机容量上限。

注意事项

OceanBase 数据库支持两种类型的租户,MySQL 兼容模式和 Oracle 兼容模式。创建租户时,您需要指定租户的类型。租户创建后,租户类型无法修改,因此创建租户前请规划好您的租户类型。

步骤一:创建资源规格

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

说明
基于 OceanBase 数据库 3.x 版本的大量实践经验,OceanBase 数据库 V4.0 的资源管理功能有很大改进:
• 支持 Unit 级别管理 CPU、内存、日志盘空间、IOPS 等资源项,不支持 Unit 级别管理数据盘空间和 Session 个数等资源项。为了兼容 3.x 版本的运维工具和测试用例,CREATE RESOURCE UNIT 语句依然可以指定 MAX_DISK_SIZE 和 MAX_SESSION_NUM,但是不会生效,也不会报错。
• 支持 CPU 超卖,通过超卖配置项 resource_hard_limit 控制。GV$OB_SERVERS 视图中的 CPU_CAPACITY 和 CPU_CAPACITY_MAX 字段分别表示节点 CPU 总容量和节点 CPU 总容量的超卖值,且 CPU_CAPACITY_MAX = CPU_CAPACITY * resource_hard_limit
• 不再支持内存超卖,引入内存超卖可能会导致租户工作不稳定。
• 支持租户间日志盘空间隔离,系统为每个租户预留日志盘空间,避免 V3.x 版本某个租户大量写入导致日志盘写爆从而影响其他租户的问题。
• 支持租户间 IOPS 隔离,引入三个 IOPS 规格参数:MIN_IOPSMAX_IOPSIOPS_WEIGHT,IOPS 规格参数默认不需要指定,系统根据 CPU 规格自动计算。如果一个节点上所有 Unit 的 MIN_IOPS 之和超过了磁盘 IOPS 上限,则会根据 IOPS_WEIGHT 权重来分配 IOPS 资源。
• Meta 租户没有独立的 Unit,系统创建租户时默认为 Meta 租户预留资源,各项资源从用户租户资源中扣除。Meta 各项资源采用默认配置,不支持用户指定。
• 创建资源规格时 CPU 规格 和内存规格是必选项,其他参数可以自动计算,其中日志盘空间按照内存规格自动计算,IOPS 规格按照 CPU 规格自动计算。

操作步骤

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

    obclient -h172.30.xx.xx -P2883 -uroot@sys#cluster -p**** -A

  2. 进入 oceanbase 数据库。

    USE oceanbase;

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

    obclient [oceanbase]> SELECT * FROM oceanbase.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               | 2022-12-20 17:50:17.035504 | 2022-12-20 17:50:17.035504 |       1 |       1 | 14495514624 |   14495514624 |    10000 |    10000 |           1 |
    |           1001 | config_mysql001_zone1_S1_okz  | 2022-12-20 18:04:31.547715 | 2022-12-20 18:04:31.547715 |     1.5 |     1.5 |  6442450944 |   19327352832 |    15000 |    15000 |           1 |
    |           1002 | config_mysql001_zone2_S1_pme  | 2022-12-20 18:04:31.561335 | 2022-12-20 18:04:31.561335 |     1.5 |     1.5 |  6442450944 |   19327352832 |    15000 |    15000 |           1 |
    |           1003 | config_mysql001_zone3_S1_jsu  | 2022-12-20 18:04:31.564510 | 2022-12-20 18:04:31.564510 |     1.5 |     1.5 |  6442450944 |   19327352832 |    15000 |    15000 |           1 |
    |           1013 | config_oracle001_zone3_S1_exu | 2022-12-26 18:28:37.969047 | 2022-12-26 18:28:37.969047 |     1.5 |     1.5 |  6442450944 |   19327352832 |    15000 |    15000 |           1 |
    |           1014 | config_oracle001_zone2_S1_hli | 2022-12-26 18:28:37.972194 | 2022-12-26 18:28:37.972194 |     1.5 |     1.5 |  6442450944 |   19327352832 |    15000 |    15000 |           1 |
    |           1015 | config_oracle001_zone1_S1_owy | 2022-12-26 18:28:37.976446 | 2022-12-26 18:28:37.976446 |     1.5 |     1.5 |  6442450944 |   19327352832 |    15000 |    15000 |           1 |
    +----------------+-------------------------------+----------------------------+----------------------------+---------+---------+-------------+---------------+----------+----------+-------------+
    7 rows in set
    

    DBA_OB_UNIT_CONFIGS 视图的详细说明,参见 DBA_OB_UNIT_CONFIGS

  4. 通过 CREATE RESOURCE UNIT 语句,创建资源规格。

    语法如下:

    CREATE RESOURCE UNIT unit_name 
        MEMORY_SIZE [=] 'size_value',
        MAX_CPU [=] cpu_num,  
        [LOG_DISK_SIZE [=] 'size_value',]
        [MAX_IOPS [=] iops_num,]
        [MIN_CPU [=] cpu_num,]
        [MIN_IOPS [=] iops_num];
    

    参数说明:

    创建资源规格时,MAX_CPU 和 MEMORY_SIZE 必选。

    • unit_name:资源规格名称。

    • MEMORY_SIZE:内存规格,最小为 1G。OceanBase 数据库 V4.0 开始不支持内存超卖。

    • MAX_CPU:CPU 规格上限,MIN_CPU 是 CPU 规格下限,单位是核数。如果用户没有指定 MIN_CPU,默认等于 MAX_CPU 值。

    • MIN_CPU:最小的 CPU 规格,所有租户的 MIN_CPU 的总和不能超过该节点 CPU 总容量 CPU_CAPACITY

    • MAX_IOPS 和 MIN_IOPSMAX_IOPS 和 MIN_IOPS 参数的最小值为 1024,并且要求 MAX_IOPS >= MIN_IOPS。如果不指定,默认系统将根据 CPU 的规格自动计算。

      系统自动计算 IOPS 参数值的规则如下:

      • 如果 MIN_IOPS 和 MAX_IOPS 均未指定,则根据 MIN_CPU 规格自动计算,1 个 Core 对应 1 万 IOPS 的值,即 MAX_IOPS = MIN_IOPS = MIN_CPU * 10000。此时:
        • 如果未指定 IOPS_WEIGHT 的值,则 IOPS_WEIGHT = MIN_CPU
        • 如果指定了 IOPS_WEIGHT的值,则以指定的值为准。
      • 如果仅指定了 MAX_IOPS 的值,则 MIN_IOPS 取 MAX_IOPS 的值;同样,如果仅指定了 MIN_IOPS 的值,则 MAX_IOPS 取 MIN_IOPS 的值。此时:
        • 如果 IOPS_WEIGHT 的值未指定,则默认为 0
    • LOG_DISK_SIZE:日志盘空间,OceanBase 数据库 V4.0 会按租户管理日志盘空间,系统为各个租户预留日志盘空间,实现按租户隔离。当用户没有指定时,LOG_DISK_SIZE 默认值是内存规格的 3 倍大小,最小为 2G。

    • OceanBase 数据库 V4.0 支持租户间 IOPS 隔离,通过 MAX_IOPSMIN_IOPSIOPS_WEIGHT 三个参数决定。IOPS 规格参数默认不需要指定,系统根据 CPU 规格自动计算。

    CREATE RESOURCE UNIT 语句的详细说明,参见 CREATE RESOURCE UNIT

    示例:

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

    obclient [oceanbase]> 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;
    
  5. 查询 DBA_OB_UNIT_CONFIGS 视图,确认资源规格创建成功。

    obclient [oceanbase]> SELECT * FROM oceanbase.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 |
    +----------------+----------------+----------------------------+----------------------------+---------+---------+-------------+---------------+----------+----------+-------------+
    |           1020 | S1_unit_config | 2023-01-10 22:31:38.805862 | 2023-01-10 22:31:38.805862 |       1 |       1 |  2147483648 |    6442450944 |    10000 |    10000 |           1 |
    +----------------+----------------+----------------------------+----------------------------+---------+---------+-------------+---------------+----------+----------+-------------+
    1 row in set
    

步骤二:创建资源池

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

前提条件

  • 确认集群是否有足够的可用资源来创建资源池。详细操作,参见 查看租户和资源信息
  • 创建资源池时需要指定其资源规格。在执行创建资源池操作前,请确认是否有可用的资源规格。有关创建资源规格的详细操作,参见 创建资源规格

操作步骤

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

    obclient -h172.30.xx.xx -P2883 -uroot@sys#cluster -p**** -A

  2. 进入 oceanbase 数据库。

    obclient [(none)]> USE oceanbase;

  3. 通过 DBA_OB_RESOURCE_POOLS 视图,获取资源池的配置信息。

    obclient [oceanbase]> SELECT * FROM oceanbase.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 | 2022-12-20 17:50:17.038641 | 2022-12-20 17:50:17.045453 |          1 |              1 | zone1;zone2;zone3 | FULL         |
    |             1001 | pool_mysql001_zone3_jsu  |      1002 | 2022-12-20 18:04:31.607227 | 2022-12-20 18:04:31.692836 |          1 |           1003 | zone3             | FULL         |
    |             1002 | pool_mysql001_zone1_okz  |      1002 | 2022-12-20 18:04:31.617087 | 2022-12-20 18:04:31.691827 |          1 |           1001 | zone1             | FULL         |
    |             1003 | pool_mysql001_zone2_pme  |      1002 | 2022-12-20 18:04:31.621327 | 2022-12-20 18:04:31.692836 |          1 |           1002 | zone2             | FULL         |
    |             1013 | pool_oracle001_zone3_exu |      1010 | 2022-12-26 18:28:37.979539 | 2022-12-26 18:28:38.059505 |          1 |           1013 | zone3             | FULL         |
    |             1014 | pool_oracle001_zone1_owy |      1010 | 2022-12-26 18:28:37.988964 | 2022-12-26 18:28:38.058440 |          1 |           1015 | zone1             | FULL         |
    |             1015 | pool_oracle001_zone2_hli |      1010 | 2022-12-26 18:28:37.994241 | 2022-12-26 18:28:38.059505 |          1 |           1014 | zone2             | FULL         |
    +------------------+--------------------------+-----------+----------------------------+----------------------------+------------+----------------+-------------------+--------------+
    7 rows in set
    

    DBA_OB_RESOURCE_POOLS 视图的详细说明,参见 DBA_OB_RESOURCE_POOLS

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

    语法如下:

    CREATE RESOURCE POOL poolname 
        UNIT [=] unitname, 
        UNIT_NUM [=] unitnum, 
        ZONE_LIST [=] ('zone' [, 'zone' ...]);
    

    参数说明:

    • UNIT:该资源池的资源规格。
    • UNIT_NUM:该资源池在目标 Zone 的 Unit 个数,它的值要小于目标 Zone 的节点个数,且每个节点上最多只能分布同一个租户的一个 Unit。
    • ZONE_LIST:资源池的 Zone 分布。OceanBase 数据库会在 ZONE_LIST 描述的每个 Zone 里面创建 UNIT_NUM 个 Unit,每个 Unit 的资源规格为 UNIT 参数设置的值。

    CREATE RESOURCE POOL 语句的详细说明,参见 CREATE RESOURCE POOL

    示例:

    创建一个名为 mq_pool_01 的资源池,在 zone1、zone2 里各创建 1 个 Unit,每个 Unit 的资源规格为 S1_unit_config

    obclient [oceanbase]> CREATE RESOURCE POOL mq_pool_01 
                    UNIT='S1_unit_config', 
                    UNIT_NUM=1, 
                    ZONE_LIST=('zone1','zone2');
    
  5. 查询 DBA_OB_RESOURCE_POOLS 视图,确认资源池创建成功。

    obclient [oceanbase]> 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 |
    +------------------+------------+-----------+----------------------------+----------------------------+------------+----------------+-------------+--------------+
    |             1024 | mq_pool_01 |      NULL | 2023-01-10 22:37:08.212366 | 2023-01-10 22:37:08.212366 |          1 |           1020 | zone1;zone2 | FULL         |
    +------------------+------------+-----------+----------------------------+----------------------------+------------+----------------+-------------+--------------+
    1 row in set
    

步骤三:创建租户

资源池创建后,您可以根据业务需要,将资源池分配给租户。

前提条件

确保已有可用的资源池。有关创建资源池和资源单元的详细操作,参见 创建资源池

注意事项

OceanBase 数据库支持两种类型的租户,MySQL 兼容模式和 Oracle 兼容模式。创建租户时,您需要指定租户的类型。租户创建后,租户类型无法修改,因此创建租户前请规划好您的租户类型。

操作步骤

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

    obclient -h172.30.xx.xx -P2883 -uroot@sys#cluster -p**** -A

  2. 进入 oceanbase 数据库。

    USE oceanbase;

  3. 通过 DBA_OB_TENANTS 视图,查看所有的租户信息。

    obclient [oceanbase]> SELECT * FROM oceanbase.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 |
    +-----------+-------------+-------------+----------------------------+----------------------------+--------------+---------------+-------------------+--------------------+--------+---------------+--------+-------------+-------------------+------------------+---------------------+---------------------+---------------------+---------------------+--------------+----------------------------+
    |         1 | sys         | SYS         | 2023-05-17 18:10:19.940353 | 2023-05-17 18:10:19.940353 | RANDOM       | FULL{1}@zone1 | NULL              | MYSQL              | NORMAL | NO            | NO     | PRIMARY     | NORMAL            |                0 |                NULL |                NULL |                NULL |                NULL | NOARCHIVELOG | DISABLED                   |
    |      1001 | META$1002   | META        | 2023-05-17 18:15:21.455549 | 2023-05-17 18:15:36.639479 | zone1        | FULL{1}@zone1 | NULL              | MYSQL              | NORMAL | NO            | NO     | PRIMARY     | NORMAL            |                0 |                NULL |                NULL |                NULL |                NULL | NOARCHIVELOG | DISABLED                   |
    |      1002 | mysql001    | USER        | 2023-05-17 18:15:21.461276 | 2023-05-17 18:15:36.669988 | zone1        | FULL{1}@zone1 | NULL              | MYSQL              | NORMAL | NO            | NO     | PRIMARY     | NORMAL            |                0 | 1684395321137516636 | 1684395321137516636 | 1684395321052204807 | 4611686018427387903 | NOARCHIVELOG | DISABLED                   |
    |      1003 | META$1004   | META        | 2023-05-17 18:18:19.927859 | 2023-05-17 18:18:36.443233 | zone1        | FULL{1}@zone1 | NULL              | MYSQL              | NORMAL | NO            | NO     | PRIMARY     | NORMAL            |                0 |                NULL |                NULL |                NULL |                NULL | NOARCHIVELOG | DISABLED                   |
    |      1004 | oracle001   | USER        | 2023-05-17 18:18:19.928914 | 2023-05-17 18:18:36.471606 | zone1        | FULL{1}@zone1 | NULL              | ORACLE             | NORMAL | NO            | NO     | PRIMARY     | NORMAL            |                0 | 1684395321137558760 | 1684395321137558760 | 1684395320951813345 | 4611686018427387903 | NOARCHIVELOG | DISABLED                   |
    +-----------+-------------+-------------+----------------------------+----------------------------+--------------+---------------+-------------------+--------------------+--------+---------------+--------+-------------+-------------------+------------------+---------------------+---------------------+---------------------+---------------------+--------------+----------------------------+
    5 rows in set
    

    DBA_OB_TENANTS 视图的详细说明,请参见 DBA_OB_TENANTS

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

    语法如下:

    CREATE TENANT [IF NOT EXISTS] tenant_name PRIMARY_ZONE [=] zone, RESOURCE_POOL_LIST [=](poolname [, poolname...]) [ENABLE_ARBITRATION_SERVICE = {true | false}] {SET | SET VARIABLES | VARIABLES} system_var_name = expr [,system_var_name = expr] ...

    参数说明:

    • IF NOT EXISTS:可选参数,如果要创建的租户名已存在,并且没有指定 IF NOT EXISTS,则会出现错误。

    • tenant_name:指定租户名称,最长 128 个字符,字符只能是大小写英文字母、数字和下划线,而且必须以字母或下划线开头。

    • PRIMARY_ZONE:指定租户的 Primary Zone。V4.0 版本修改 Primary Zone 功能并不完善,并不能实现租户下已有表和分区的读写服务能力的扩缩容。建议用户创建租户时一次性配置好租户的 Primary Zone 属性。

      PRIMARY_ZONE 指定了租户提供读写服务的 Zone 的优先级。实际上是一个 Zone 的列表,列表中包含多个 Zone。当列表包含多个 Zone 时,使用分号(;)分隔的 Zone 具有从高到低的优先级,使用逗号(,)分隔的 Zone 具有相同优先级,表示流量打散在多个 Zone 上,这几个 Zone 同时提供服务。

      例如,primary_zone ='zone1;zone2,zone3' 表示该租户优先由 zone1 提供读写服务,zone1 比 zone2、zone3 的优先级高,zone2 和 zone3 是同一优先级。

      注意
      在指定 PRIMARY_ZONE 时,其值可以设置为 RANDOM(必须大写),表示随机选择最高优先级内的任意一个 Zone 作为 Primary Zone

    • RESOURCE_POOL_LIST:指定分配给租户的资源池列表,必填。如果有多个资源池,要求多个资源池的 UNIT_NUM 个数一致。

      租户的副本分布的 Zone List 继承于 RESOURCE_POOL_LIST 的 ZONE_LIST 属性,租户的副本个数继承于 RESOURCE_POOL_LIST 的 ZONE_LIST 属性的个数,租户在每个 Zone 的 Unit 个数继承于 RESOURCE_POOL_LIST 的 UNIT_NUM 属性、租户的 Unit 的资源规格继承于 RESOURCE_POOL_LIST 的 Unit 属性。

      注意
      属于同一个租户的多个资源池,对应的 ZONE_LIST 彼此不允许有交集。

    • ENABLE_ARBITRATION_SERVICE:指定租户是否开启仲裁服务,如果不显示指定,默认创建的租户其仲裁服务为关闭状态。如果创建租户的时候未开启仲裁服务,可以在创建租户后再开启仲裁服务,详细操作请参见 为租户开启仲裁服务

      功能适用性
      该内容仅适用于 OceanBase 数据库企业版。OceanBase 数据库社区版暂不支持仲裁服务功能。

    • system_var_name:指定系统变量或配置项。

      • OB_TCP_INVITED_NODES:用于指定租户连接的白名单,即允许哪些客户端 IP 连接该租户。示例中 % 表示所有客户端都可登录,如果不指定 OB_TCP_INVITED_NODES 的值,则默认租户的连接方式为只允许本机的 IP 登录该租户。白名单配置的详细介绍,参见 查看和设置白名单
      • OB_COMPATIBILITY_MODE:用于指定租户的兼容模式,可选择 MySQL 或 Oracle 兼容模式,并且只能在创建时指定。如果不指定 OB_COMPATIBILITY_MODE,则默认兼容模式为 MySQL 模式。

    CREATE TENANT 语句的详细说明,参见 CREATE TENANT

    示例:

    • 创建一个名为 mq_t1 的租户(默认为 MySQL 模式租户),副本数为 3,资源池指定为 mq_pool_01,Primary Zone 为 zone1,允许所有 IP 连接数据库。

      租户的副本分布的 Zone List 继承于 resource_pool_list 的 zone_list 属性,租户的副本个数继承于 resource_pool_list 的 zone_list 属性的个数,租户在每个 Zone 的 Unit 个数继承于 resource_pool_list 的 unit_num 属性、租户的 Unit 的资源规格继承于 resource_pool_list 的 unit 属性。

      obclient [oceanbase]> CREATE TENANT IF NOT EXISTS mq_t1 PRIMARY_ZONE='zone1', RESOURCE_POOL_LIST=('mq_pool_01') set OB_TCP_INVITED_NODES='%';

    • 创建一个名为 oracle_tenant1 的 Oracle 兼容模式租户,需要显式指定 ob_compatibility_mode='oracle'

      obclient [oceanbase]>CREATE TENANT IF NOT EXISTS oracle_tenant1 PRIMARY_ZONE='zone1', RESOURCE_POOL_LIST=('mq_pool_01') SET OB_TCP_INVITED_NODES='%', ob_compatibility_mode='oracle';

  5. 查询 DBA_OB_TENANTS 视图,确认租户创建成功。

    obclient [oceanbase]> 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 |
    +-----------+-------------+-------------+----------------------------+----------------------------+--------------+------------------------------+-------------------+--------------------+--------+---------------+--------+-------------+-------------------+------------------+---------------------+---------------------+---------------------+---------------------+--------------+----------------------------+
    |      1006 | mq_t1       | USER        | 2023-05-18 15:48:57.447657 | 2023-05-18 15:49:12.857944 | zone1;zone2  | FULL{1}@zone1, FULL{1}@zone2 | NULL              | MYSQL              | NORMAL | NO            | NO     | PRIMARY     | NORMAL            |                0 | 1684396167132057328 | 1684396167132057328 | 1684396167051160964 | 4611686018427387903 | NOARCHIVELOG | DISABLED                   |
    +-----------+-------------+-------------+----------------------------+----------------------------+--------------+------------------------------+-------------------+--------------------+--------+---------------+--------+-------------+-------------------+------------------+---------------------+---------------------+---------------------+---------------------+--------------+----------------------------+
    1 row in set
    
  6. 租户创建成功后,可以尝试登录租户进行使用。

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

    • MySQL 兼容模式

      1. 登录 mq_t1 租户的 root 用户。

        obclient -h172.30.xx.xx -P2883 -uroot@mq_t1#cluster -A

      2. 执行以下语句修改 root 用户的密码。

        obclient [(none)]> ALTER USER root IDENTIFIED BY '****'; Query OK, 0 rows affected

    • Oracle 兼容模式

      1. 登录 moracle_tenant1 租户的 sys 用户。

        obclient -h172.30.xx.xx -P2883 -usys@oracle_tenant1#cluster -A

      2. 执行以下语句修改 sys 用户的密码。

        obclient [SYS]> ALTER USER sys IDENTIFIED BY '****'; Query OK, 0 rows affected

  7. 管理员用户密码修改成功后,重新登录租户。

    • MySQL 兼容模式

      obclient -h172.30.xx.xx -P2883 -uroot@mq_t1#cluster -p**** -A

    • Oracle 兼容模式

      obclient -h172.30.xx.xx -P2883 -usys@oracle_tenant1#cluster -p**** -A

后续操作

租户创建成功后,您可以使用管理员用户登录并连接数据库,更多连接数据库的方法和详细操作请参见 连接数据库概述(MySQL 模式) 和 连接数据库概述(Oracle 模式)。如果您需要使用普通用户登录,则需要为租户创建新的普通用户并授权,创建用户并授权的相关操作请参见 用户和权限

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论