OceanBase 数据库面向多租户设计。 在一个大集群中,您可以创建很多租户,不同的部门使用不同的租户。租户和租户之间资源已经进行了隔离,保障了相互之间访问不受影响,类似于数据库中的实例。
背景
MySQL 是一个单租户的模式,所有用户在一套资源池下进行使用,这可能会导致一种故障。当用户负载非常高时,应用将用尽数据库的所有资源,导致数据库管理员无法连接数据库,也无法执行一些高优先级的控制命令。例如无法执行 kill 命令“杀死”超时的查询,或者一些管理平台也无法连接到数据库等。
OceanBase 数据库默认会自动创建 sys 租户,sys 租户负责一部分 OceanBase 数据库的管理工作,并且能够访问系统元数据表,sys 自动预留了一定的资源。
创建租户
使用系统租户的 root 用户(
root@sys)连接 OceanBase 数据库。如下所示,您可使用 OBClient 或 MySQL 客户端进行连接:obclient -hxxxx -uroot@sys -P${port_num} -p -Doceanbase -A # 或 mysql -hxxxx -uroot@sys -P${port_num} -p -Doceanbase -AOBClient 的详细信息,请参考 OBClient 文档。
注意
只有
root@sys用户拥有创建租户的权限。查询集群内各 Server 的资源占用情况,例如:
obclient> SELECT * FROM oceanbase.GV$OB_SERVERS; +-----------------+----------+-------+----------+--------------+------------------+--------------+------------------+--------------+--------------+-------------------+-------------------+-----------------+--------------------+------------------+-------------------------+--------------+-------------------------+-----------------------+ | SVR_IP | SVR_PORT | ZONE | SQL_PORT | CPU_CAPACITY | CPU_CAPACITY_MAX | CPU_ASSIGNED | CPU_ASSIGNED_MAX | MEM_CAPACITY | MEM_ASSIGNED | LOG_DISK_CAPACITY | LOG_DISK_ASSIGNED | LOG_DISK_IN_USE | DATA_DISK_CAPACITY | DATA_DISK_IN_USE | DATA_DISK_HEALTH_STATUS | MEMORY_LIMIT | DATA_DISK_ABNORMAL_TIME | SSL_CERT_EXPIRED_TIME | +-----------------+----------+-------+----------+--------------+------------------+--------------+------------------+--------------+--------------+-------------------+-------------------+-----------------+--------------------+------------------+-------------------------+--------------+-------------------------+-----------------------+ | 172.xxx.xxx.228 | 2882 | zone1 | 2881 | 8 | 8 | 1 | 1 | 10737418240 | 2684354560 | 5368709120 | 2684354560 | 134217728 | 10737418240 | 83886080 | NORMAL | 17179869184 | NULL | NULL | +-----------------+----------+-------+----------+--------------+------------------+--------------+------------------+--------------+--------------+-------------------+-------------------+-----------------+--------------------+------------------+-------------------------+--------------+-------------------------+-----------------------+ | 172.xxx.xxx.229 | 2882 | zone2 | 2881 | 8 | 8 | 1 | 1 | 10737418240 | 2684354560 | 5368709120 | 2684354560 | 134217728 | 10737418240 | 83886080 | NORMAL | 17179869184 | NULL | NULL | +-----------------+----------+-------+----------+--------------+------------------+--------------+------------------+--------------+--------------+-------------------+-------------------+-----------------+--------------------+------------------+-------------------------+--------------+-------------------------+-----------------------+ | 172.xxx.xxx.230 | 2882 | zone3 | 2881 | 8 | 8 | 1 | 1 | 10737418240 | 2684354560 | 5368709120 | 2684354560 | 134217728 | 10737418240 | 83886080 | NORMAL | 17179869184 | NULL | NULL | +-----------------+----------+-------+----------+--------------+------------------+--------------+------------------+--------------+--------------+-------------------+-------------------+-----------------+--------------------+------------------+-------------------------+--------------+-------------------------+-----------------------+ 3 row in set查询集群内各租户的资源分配情况,例如:
obclient> SELECT * FROM oceanbase.GV$OB_UNITS; +-----------------+----------+---------+-----------+-------+---------+---------+-------------+----------+----------+-------------+---------------+-----------------+------------------+--------+----------------------------+ | SVR_IP | SVR_PORT | UNIT_ID | TENANT_ID | ZONE | MAX_CPU | MIN_CPU | MEMORY_SIZE | MAX_IOPS | MIN_IOPS | IOPS_WEIGHT | LOG_DISK_SIZE | LOG_DISK_IN_USE | DATA_DISK_IN_USE | STATUS | CREATE_TIME | +-----------------+----------+---------+-----------+-------+---------+---------+-------------+----------+----------+-------------+---------------+-----------------+------------------+--------+----------------------------+ | 172.xxx.xxx.228 | 2882 | 1 | 1 | zone1 | 1 | 1 | 2684354560 | 10000 | 10000 | 1 | 2684354560 | 85075438 | 83886080 | NORMAL | 2022-11-08 14:24:01.960562 | | 172.xxx.xxx.229 | 2882 | 1 | 1 | zone2 | 1 | 1 | 2684354560 | 10000 | 10000 | 1 | 2684354560 | 85075438 | 83886080 | NORMAL | 2022-11-08 14:24:01.960562 | | 172.xxx.xxx.230 | 2882 | 1 | 1 | zone3 | 1 | 1 | 2684354560 | 10000 | 10000 | 1 | 2684354560 | 85075438 | 83886080 | NORMAL | 2022-11-08 14:24:01.960562 | +-----------------+----------+---------+-----------+-------+---------+---------+-------------+----------+----------+-------------+---------------+-----------------+------------------+--------+----------------------------+ 3 row in set创建资源单元
obclient> CREATE RESOURCE UNIT unit1 max_cpu = 1, min_cpu = 1, memory_size = 2684354560, max_iops = 10000, min_iops = 10000, iops_weight = 1, log_disk_size = 2684354560;创建资源单元的 SQL 语句详细介绍请参考 创建资源单元。
创建资源池
obclient> CREATE RESOURCE POOL pool1 UNIT = 'unit1', UNIT_NUM = 1, ZONE_LIST = ('zone1','zone2','zone3');其中:
UNIT_NUM 表示在集群的一个 Zone 里面包含的资源单元个数。该值小于等于一个 Zone 中的 OBServer 的个数。
ZONE_LIST 表示资源池的 Zone 列表,显示该资源池的资源在哪些 Zone 中被使用。
如果在某个 Zone 内找不到足够剩余资源的机器来创建资源单元,资源池会创建失败。
有关该 SQL 语句的详细信息,请参考 创建资源池。
创建租户
obclient> CREATE TENANT IF NOT EXISTS tenant1 charset='utf8mb4', comment 'mysql tenant/instance', primary_zone='RANDOM', resource_pool_list = ('pool1') set ob_tcp_invited_nodes = '%';有关该 SQL 语句的详细信息,请参考 新建租户。
修改密码
使用新创建租户的 root 用户(
root@tenant1)连接 OceanBase 数据库,之后您需执行如下命令为 root 用户创建密码:# 使用 root@tenant1 连接 OceanBase 数据库 obclient -hxxxx -uroot@tenant1 -P${port_num} -p -Doceanbase -A # 修改密码 obclient> ALTER USER username IDENTIFIED BY 'password'; # 举例如下 obclient> ALTER USER root IDENTIFIED BY 'Xc****Db';命令详细介绍请参考 修改用户密码。
创建用户
首次使用新租户连接 OceanBase 数据库时,您必须使用 root 用户。成功连接后,您可执行如下命令创建新用户连接 OceanBase 数据库。
obclient> CREATE USER IF NOT EXISTS test IDENTIFIED BY '**1***';
详细信息请参考 创建用户。




