OceanBase 常用 SQL 语句及分区和分片介绍
有一段时间没有更新 OceanBase 相关文章了。前段时间一方面忙着其他事情,另一方面兴致来了,又连续写了一周的 GaussDB 博客。从今天开始,重新回到 OceanBase,这篇文章先把之前学习和实践过程中常用到的 SQL 语句做一次汇总,也算是对前面内容的一次复习和整理。
1. OBServer 参数管理
sql
1、查看 OBServer 的资源分配
SELECT SVR_IP, ZONE,CPU_CAPACITY, CPU_ASSIGNED, ROUND(MEMORY_LIMIT/1024/1024/1024,1) AS MEM_LIMIT_GB, ROUND(MEM_CAPACITY/1024/1024/1024,1) AS MEM_CAPACITY_GB, ROUND(MEM_ASSIGNED/1024/1024/1024,1) AS MEM_ASSIGNED_GB, ROUND(DATA_DISK_ALLOCATED/1024/1024/1024,1) AS DATA_ALLOCATED_GB, ROUND(DATA_DISK_IN_USE/1024/1024/1024,1) AS DATA_USED_GB, ROUND(LOG_DISK_CAPACITY/1024/1024/1024,1) AS LOG_DISK_GB, ROUND(LOG_DISK_ASSIGNED/1024/1024/1024,1) AS LOG_ALLOCATED_GB, ROUND(LOG_DISK_IN_USE/1024/1024/1024,1) AS LOG_USED_GB
FROM oceanbase.GV$OB_SERVERS;
2、查看集群配置项(PARAMETER)
-- (1) GV$OB_PARAMETERS 视图,可以查看隐藏参数
SELECT zone, svr_ip, name, value, info FROM oceanbase.GV$OB_PARAMETERS WHERE name like 'MEMORY_LIMIT' OR name like 'SYSTEM_MEMORY' order by name;
-- (2) show parameters 方法;
show parameters like 'memory_limit';
3、查看系统变量(VARIABLES)
-- (1) SYS 租户可以查询所有租户的系统变量
SELECT * FROM oceanbase.CDB_OB_SYS_VARIABLES WHERE TENANT_ID=1002 AND NAME='ob_query_timeout';
-- (2) MySQL 租户查看本租户的 SESSION_VARIABLES 和 GLOBAL_VARIABLES
SELECT * FROM INFORMATION_SCHEMA.SESSION_VARIABLES WHERE VARIABLE_NAME = 'ob_query_timeout';
SELECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME = 'ob_query_timeout';
-- (3) Oracle 租户查看本租户的 SESSION_VARIABLES 和 GLOBAL_VARIABLES
SELECT * FROM SYS.TENANT_VIRTUAL_GLOBAL_VARIABLE;
SELECT * FROM SYS.TENANT_VIRTUAL_SESSION_VARIABLE;
4、修改集群级配置项,动态直接生效,少数 STATIC_EFFECTIVE 静态参数需要重启生效
-- (1) 默认所有节点修改
ALTER SYSTEM SET memory_limit = '16G';
-- (2) 部分节点修改
ALTER SYSTEM SET memory_limit = '20G' SERVER = '192.168.182.21:2882';
ALTER SYSTEM SET memory_limit = '10G' ZONE = 'zone2';
-- (3) 启动 OBServer 时指定参数,不会修改 `observer.config.bin` 文件,在内存级临时覆盖
/home/admin/oceanbase/bin/observer -I 192.168.182.21 -P 2882 ... -o "cpu_count=8,system_memory=2G"
5、修改租户配置项和系统变量
5.1、修改租户配置项(PARAMETER)
-- (1) 登录业务租户修改
obclient -h192.168.182.23 -P2883 -uroot@ob_t1#obcluster -Doceanbase -A -padmin@123
SQL > alter system set freeze_trigger_percentage = 21;
-- (2) 在 sys 租户中修改
ALTER SYSTEM SET freeze_trigger_percentage = 20 TENANT = 'ob_t1';
show parameters like 'freeze%' tenant = 'ob_t1';
5.2、修改租户系统变量(VARIABLES)
-- (1) 登录业务租户修改
obclient -h192.168.182.23 -P2883 -uroot@ob_t1#obcluster -Doceanbase -A -p
SQL > set ob_query_timeout = 60000000 ;
SQL > set GLOBAL ob_query_timeout = 60000000 ;
-- (2) 在 sys 租户中修改业务租户系统变量,经过测试修改的是 Global 级别的系统变量
ALTER TENANT ob_t1 SET VARIABLES ob_query_timeout = 60000000 ;
-- (3) 开后门: sys 租户先切换租户再设置
ALTER SYSTEM CHANGE TENANT ob_t1; --切换到 ob_t1 租户
show tenant; --显示当前租户
SET GLOBAL ob_query_timeout = 20000000;
2. 租户管理
租户(Tenant)可以类比传统数据库的实例,是 OceanBase 提供数据库服务和资源隔离的基本单位。多个租户共享同一套 OceanBase 集群,但各租户的数据、用户、权限及资源相互隔离。
租户包含 sys 租户 和 用户租户,用户租户有 Oracle 兼容模式、MySQL 兼容模式。其中 :
- sys 租户 :系统租户,负责集群级管理,不存在对应的
Meta租户。 - 用户租户:真正为用户提供数据库服务的租户。
Meta租户 :每个用户租户都有一个对应的Meta租户,主要用于管理该用户租户的内部元数据等信息。
sql
1、创建租户
-- 创建租户三部曲:
-- 1. 创建资源规格 CREATE RESOURCE unit unit_mini max_cpu=1, memory_size='2G';
-- 2. 创建资源池 CREATE RESOURCE POOL mini_pool UNIT='unit_mini', UNIT_NUM=1, ZONE_LIST=('zone1','zone2','zone3');
-- 3. 创建租户 CREATE TENANT ob_t1, PRIMARY_ZONE = 'zone1,zone2,zone3', RESOURCE_POOL_LIST=('mini_pool') SET ob_tcp_invited_nodes='%';
2、 查看资源信息
-- 查看资源规格
SELECT unit_config_id, name AS unit_config_name, max_cpu, min_cpu, ROUND(memory_size/1024/1024/1024,2) AS mem_size_gb, ROUND(log_disk_size/1024/1024/1024,2) AS log_disk_size_gb,MAX_IOPS,min_iops FROM oceanbase.dba_ob_unit_configs ORDER BY unit_config_id;
-- 查看资源池
SELECT resource_pool_id, name, tenant_id, unit_count, unit_config_id, zone_list FROM oceanbase.dba_ob_resource_pools ORDER BY tenant_id;
-- 查看资源单元实体
SELECT unit_id, tenant_id, resource_pool_id, unit_group_id,zone, svr_ip, svr_port, max_cpu, min_cpu, ROUND(memory_size/1024/1024/1024,2) AS mem_size_gb, ROUND(log_disk_size/1024/1024/1024,2) AS log_disk_gb FROM oceanbase.dba_ob_units ORDER BY tenant_id, unit_id;
3、查看租户
-- 租户信息,包括租户名称、租户类型、租户兼容模式、PRIMARY_ZONE、副本和状态
SELECT TENANT_ID, TENANT_NAME, TENANT_TYPE, COMPATIBILITY_MODE, PRIMARY_ZONE, LOCALITY, STATUS FROM oceanbase.DBA_OB_TENANTS;
-- 查询已创建租户包含的节点 IP
SELECT a.TENANT_NAME,a.TENANT_ID,b.SVR_IP FROM oceanbase.DBA_OB_TENANTS a,oceanbase.GV$OB_UNITS b WHERE a.TENANT_ID=b.TENANT_ID ORDER BY 2,3;
-- 查看租户对应的资源池
SELECT t.TENANT_NAME, rp.NAME AS resource_pool, u.UNIT_CONFIG_ID, s.SVR_IP
FROM oceanbase.DBA_OB_TENANTS t
JOIN oceanbase.DBA_OB_RESOURCE_POOLS rp ON t.TENANT_ID = rp.TENANT_ID
JOIN oceanbase.DBA_OB_UNITS u ON rp.RESOURCE_POOL_ID = u.RESOURCE_POOL_ID
JOIN oceanbase.DBA_OB_SERVERS s ON u.SVR_IP = s.SVR_IP
WHERE t.TENANT_TYPE = 'USER';
-- 查看租户 ➡️ 资源池 ➡️ 资源单元(Unit) ➡️ 物理节点(Observer) ➡️ 资源规格 完整链路和规格
select t4.tenant_id, t4.tenant_name, t1.name resource_pool_name, t3.unit_id, t2.name unit_config_name, t3.zone, concat(t3.svr_ip,':',t3.svr_port) observer,
t2.max_cpu, t2.min_cpu,
round(t2.memory_size/1024/1024/1024,2) mem_size_gb,
round(t2.log_disk_size/1024/1024/1024,2) log_disk_size_gb
from __all_resource_pool t1
join __all_unit_config t2 on (t1.unit_config_id=t2.unit_config_id)
join __all_unit t3 on (t1.resource_pool_id = t3.resource_pool_id)
left join __all_tenant t4 on (t1.tenant_id=t4.tenant_id)
order by t1.resource_pool_id, t2.unit_config_id, t3.unit_id;
4、修改租户
-- 1. 修改 Locality, Locality 描述了数据的多个副本的类型及分布策略, Locality: replicas{量词}@location
ALTER TENANT mysql LOCALITY=" F@zone1 , F@zone2 , F@zone3 ";
-- replicas :副本类型,即 FULL 或 READONLY,也可用 F 或 R 代替。
-- 量词 :副本在指定可用区内的数量,固定为 1。
-- location :可用区的名字。
-- 2. 修改 Primary zone,逗号两侧优先级相同,分号左侧优先级高于右侧。
-- Primary Zone 决定了 OceanBase 数据库的流量分布。通过修改 Primary Zone 属性可以切换业务流量,适用于容灾场景、扩缩容等场景。
ALTER TENANT mysql PRIMARY_ZONE='zone1;zone2;zone3';
ALTER TENANT mysql PRIMARY_ZONE='zone1,zone2,zone3';
ALTER TENANT mysql PRIMARY_ZONE='RANDOM';
5、切换租户
ALTER SYSTEM CHANGE TENANT ob_t1; --切换到 ob_t1 租户
6、登录租户,新创建的租户默认没有密码
-- 1. 直连登录
obclient -h192.168.182.21 -P2881 -uroot@ob_t1 -Doceanbase -A
- root → 用户名(sys 租户超级管理员)
- @sys → 目标租户是 sys 租户
- #MyOceanBase → 集群名(cluster name,建集群时定的 cluster_id/cluster_name)
-p:提示输入密码
-c:保留注释:客户端不剥离 SQL 里的 /* comment */,不加 -c,obclient 会像 mysql 一样把注释删掉,hint 失效。
-A:--no-auto-rehash:禁用库名/表名自动补全的 hash 构建,连接库特别多、启动很慢时加 -A 能显著加快登录速度,代价:不能 Tab 补全表名
#MyOceanBase: 走 OBProxy 时必须带 #集群名,否则 Proxy 不知道路由到哪个集群;直连 OBServer 可省略 #集群名。
-D:连接后默认进入的 database
-- 2. 通过 OBProxy 登录
obclient -h192.168.182.23 -P2883 -uroot@ob_t1#obcluster -Doceanbase -A
7、租户重命名
ALTER TENANT old_tenant_name RENAME GLOBAL_NAME TO new_tenant_name;
8、锁定租户
ALTER TENANT tenant_name LOCK | UNLOCK;
9、租户扩缩容
-- 方法1:修改资源配置(垂直扩缩容)
-- (1) 调整资源配置,直接改规格大小,适合租户使用独立的资源配置的场景(规格只被当前一个租户使用)
ALTER RESOURCE UNIT uc1 MAX_CPU 6, MEMORY_SIZE '36G';
-- (2) 切换资源配置,切换到大的规格
ALTER RESOURCE POOL pool1 UNIT 'uc2';
-- 方法2:调整资源单元个数(水平扩缩容),前提是 zone 有足够的 OBServer 数量
ALTER RESOURCE TENANT tt UNIT_NUM 2';
3. 日志流管理
OB V4 版本日志流(Log Stream)是一个租户在同一个 OBServer 上的所有 leader 分区的聚合,由于日志流是与特定 OBServer 绑定的,因此,一个日志流通常对应于同一个 OBServer 上的所有 Leader 分区,
即同一个日志流中的不同分区的 Leader 副本应分布在同一台 OBServer 上 ,而不是分散在不同的 OBServer 上。
个人认为:从一致性复制组角度看,日志流的概念比较接近 TiDB 中的 Raft Group ,OceanBase 的日志流是基于 Paxos 的日志复制和事务管理单元,一个日志流可以承载多个 Tablet;TiKV 则以 Region 为数据分片,一个 Region 对应一个 Raft Group。
日志流总数 = unit_num × (第一优先级的 Zone 数量)
例如:
- 1-1-1 的集群中 unit_num=1 ,PRIMARY_ZONE='zone1',那么日志流就是 1。
- 2-2-2 的集群中 unit_num=1 ,PRIMARY_ZONE='zone1',那么日志流还是 1。
- 2-2-2 的集群中 unit_num=2 ,PRIMARY_ZONE='RANDOM',即每区 2 个 Unit × 3 个区同等优先级,就会有 2 X 3=6 个日志流。
sql
-- 1. 查看 1002 租户每个 LS 的 Leader 在哪台机器
obclient(root@sys)[oceanbase]> SELECT TENANT_ID, LS_ID, SVR_IP, SVR_PORT, ROLE FROM oceanbase.GV$OB_LOG_STAT WHERE TENANT_ID = 1002 AND ROLE = 'LEADER' ORDER BY LS_ID;
+-----------+-------+----------------+----------+--------+
| TENANT_ID | LS_ID | SVR_IP | SVR_PORT | ROLE |
+-----------+-------+----------------+----------+--------+
| 1002 | 1 | 192.168.182.21 | 2882 | LEADER |
| 1002 | 1001 | 192.168.182.21 | 2882 | LEADER |
| 1002 | 1002 | 192.168.182.22 | 2882 | LEADER |
| 1002 | 1003 | 192.168.182.23 | 2882 | LEADER |
+-----------+-------+----------------+----------+--------+
4 rows in set (0.007 sec)
租户 1002 有 4 个日志流(LS),每个 LS 的 Leader 都分布在不同的 OBServer 上,实现了 Leader 打散,没有单节点热点。
-- 2. 看 Follower 副本是否齐全(验证 3 副本)
obclient(root@sys)[oceanbase]> SELECT LS_ID, SVR_IP, ROLE, IN_SYNC FROM oceanbase.GV$OB_LOG_STAT WHERE TENANT_ID=1002 ORDER BY LS_ID, ROLE DESC;
+-------+----------------+----------+---------+
| LS_ID | SVR_IP | ROLE | IN_SYNC |
+-------+----------------+----------+---------+
| 1 | 192.168.182.21 | LEADER | YES |
| 1 | 192.168.182.22 | FOLLOWER | YES |
| 1 | 192.168.182.23 | FOLLOWER | YES |
| 1001 | 192.168.182.21 | LEADER | YES |
| 1001 | 192.168.182.22 | FOLLOWER | YES |
| 1001 | 192.168.182.23 | FOLLOWER | YES |
| 1002 | 192.168.182.22 | LEADER | YES |
| 1002 | 192.168.182.21 | FOLLOWER | YES |
| 1002 | 192.168.182.23 | FOLLOWER | YES |
| 1003 | 192.168.182.23 | LEADER | YES |
| 1003 | 192.168.182.21 | FOLLOWER | YES |
| 1003 | 192.168.182.22 | FOLLOWER | YES |
+-------+----------------+----------+---------+
12 rows in set (0.007 sec)
-- 3. 查副本是否掉队(Leader 与 Follower 的 END_SCN 差)
obclient(root@sys)[oceanbase]> SELECT LS_ID, SVR_IP, ROLE, END_SCN, IN_SYNC FROM oceanbase.GV$OB_LOG_STAT WHERE TENANT_ID = 1002 AND LS_ID = 1001 ORDER BY ROLE;
+-------+----------------+----------+---------------------+---------+
| LS_ID | SVR_IP | ROLE | END_SCN | IN_SYNC |
+-------+----------------+----------+---------------------+---------+
| 1001 | 192.168.182.22 | FOLLOWER | 1787653265688222000 | YES |
| 1001 | 192.168.182.23 | FOLLOWER | 1787653265688222000 | YES |
| 1001 | 192.168.182.21 | LEADER | 1787653265688222000 | YES |
+-------+----------------+----------+---------------------+---------+
3 rows in set (0.006 sec)
-- 4. 看 Paxos 成员是否完整(防脑裂)
obclient(root@sys)[oceanbase]> SELECT LS_ID, ROLE, PAXOS_MEMBER_LIST, PAXOS_REPLICA_NUM FROM oceanbase.GV$OB_LOG_STAT WHERE TENANT_ID=1002;
+-------+----------+-------------------------------------------------------------------+-------------------+
| LS_ID | ROLE | PAXOS_MEMBER_LIST | PAXOS_REPLICA_NUM |
+-------+----------+-------------------------------------------------------------------+-------------------+
| 1 | LEADER | 192.168.182.21:2882:1,192.168.182.22:2882:1,192.168.182.23:2882:1 | 3 |
| 1001 | LEADER | 192.168.182.21:2882:1,192.168.182.22:2882:1,192.168.182.23:2882:1 | 3 |
| 1002 | FOLLOWER | 192.168.182.21:2882:1,192.168.182.22:2882:1,192.168.182.23:2882:1 | 3 |
| 1003 | FOLLOWER | 192.168.182.21:2882:1,192.168.182.22:2882:1,192.168.182.23:2882:1 | 3 |
| 1 | FOLLOWER | 192.168.182.21:2882:1,192.168.182.22:2882:1,192.168.182.23:2882:1 | 3 |
| 1001 | FOLLOWER | 192.168.182.21:2882:1,192.168.182.22:2882:1,192.168.182.23:2882:1 | 3 |
| 1002 | FOLLOWER | 192.168.182.21:2882:1,192.168.182.22:2882:1,192.168.182.23:2882:1 | 3 |
| 1003 | LEADER | 192.168.182.21:2882:1,192.168.182.22:2882:1,192.168.182.23:2882:1 | 3 |
| 1 | FOLLOWER | 192.168.182.21:2882:1,192.168.182.22:2882:1,192.168.182.23:2882:1 | 3 |
| 1001 | FOLLOWER | 192.168.182.21:2882:1,192.168.182.22:2882:1,192.168.182.23:2882:1 | 3 |
| 1002 | LEADER | 192.168.182.21:2882:1,192.168.182.22:2882:1,192.168.182.23:2882:1 | 3 |
| 1003 | FOLLOWER | 192.168.182.21:2882:1,192.168.182.22:2882:1,192.168.182.23:2882:1 | 3 |
+-------+----------+-------------------------------------------------------------------+-------------------+
12 rows in set (0.007 sec)
-- 5. 看 LS 整体状态(有无 CREATING/OFFLINE)
obclient(root@sys)[oceanbase]> SELECT LS_ID, STATUS, PRIMARY_ZONE FROM oceanbase.CDB_OB_LS WHERE TENANT_ID=1002;
+-------+--------+-------------------+
| LS_ID | STATUS | PRIMARY_ZONE |
+-------+--------+-------------------+
| 1 | NORMAL | zone1;zone2,zone3 |
| 1001 | NORMAL | zone1;zone2,zone3 |
| 1002 | NORMAL | zone2;zone1,zone3 |
| 1003 | NORMAL | zone3;zone1,zone2 |
+-------+--------+-------------------+
4 rows in set (0.015 sec)
-- 6. 查看 Clog 回收位点(判断是否还能建备租户),BEGIN_LSN=0 表示该 LS 从创建到现在日志没被回收过,日志链完整。
obclient(root@sys)[oceanbase]> SELECT LS_ID, BEGIN_LSN, BEGIN_SCN, END_SCN FROM oceanbase.GV$OB_LOG_STAT WHERE TENANT_ID = 1002 AND ROLE='LEADER';
+-------+-----------+---------------------+---------------------+
| LS_ID | BEGIN_LSN | BEGIN_SCN | END_SCN |
+-------+-----------+---------------------+---------------------+
| 1 | 0 | 2 | 1787653423143022000 |
| 1001 | 0 | 1787647220628040001 | 1787653423143022000 |
| 1003 | 0 | 1787647220654945001 | 1787653423134993000 |
| 1002 | 0 | 1787647220643514001 | 1787653423137764000 |
+-------+-----------+---------------------+---------------------+
4 rows in set (0.006 sec)
-- 7. 看每个 LS 承载了哪些 tablet
-- (1) sys 租户专用 CDB_OB_TABLE_LOCATIONS
SELECT a.LS_ID, a.TABLE_NAME, a.PARTITION_NAME, a.TABLET_ID, a.ROLE FROM oceanbase.CDB_OB_TABLE_LOCATIONS a WHERE a.TENANT_ID=1002 AND a.ROLE='LEADER' ORDER BY a.LS_ID, a.TABLE_NAME;
-- (2) 业务租户使用 DBA_OB_TABLE_LOCATIONS
SELECT a.LS_ID, a.TABLE_NAME, a.PARTITION_NAME, a.TABLET_ID, a.ROLE FROM oceanbase.DBA_OB_TABLE_LOCATIONS a WHERE a.ROLE='LEADER' ORDER BY a.LS_ID, a.TABLE_NAME;
4. 数据分区与分片
OceanBase 数据库参考传统数据库分区表(Partition) 的概念,将一张表的数据划分到不同的分区中。
分区的数据存储在对应的 分片(Tablet) 上,OceanBase 再将这些分片均衡地分布到多个 OBServer 上,从而实现数据的分布式存储。
4.1 分区(Partition)
分区是用户创建的逻辑对象,是 OceanBase 进行数据分片的一种方式。
主要特点:
- OceanBase 可以将同一张表的多个分区分布到多个 OBServer 节点上。
- 多个节点共同组成一个完整的表数据,实现数据的分布式存储。
- 未进行分区的表,以单分区表的形式存在。
例如创建一张包含 6 个 Hash 分区的表:
SQL
CREATE TABLE T1
(
C1 INT,
C2 VARCHAR(100),
C3 VARCHAR(1000)
)
PARTITION BY HASH(C1) PARTITIONS 6;
-- 查看分区子表
SELECT TABLE_NAME, PARTITION_NAME FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA ='test' and table_name = 't1';
+------------+----------------+
| TABLE_NAME | PARTITION_NAME |
+------------+----------------+
| T1 | p0 |
| T1 | p1 |
| T1 | p2 |
| T1 | p3 |
| T1 | p4 |
| T1 | p5 |
+------------+----------------+
-- 查看分区数量
SELECT TENANT_ID, TABLE_NAME, COUNT(DISTINCT tablet_id) AS tablet_cnt FROM oceanbase.CDB_OB_TABLE_LOCATIONS WHERE TABLE_NAME = 't1' AND ROLE = 'LEADER' GROUP BY TENANT_ID, TABLE_NAME;
+-----------+------------+------------+
| TENANT_ID | TABLE_NAME | tablet_cnt |
+-----------+------------+------------+
| 1 | T1 | 6 |
+-----------+------------+------------+
2.2 分片(Tablet)
Tablet 是分区数据的存储对象,也是 OceanBase 数据均衡的最小单位。 Partition 与 Tablet 的关系
- 普通表:
一个 Partition 对应一个 Tablet。
- 索引的 Tablet
索引的每个分区同样会对应一个 Tablet。
sql
-- 1. 创建 LOCAL 索引
CREATE INDEX I1 ON T1(C2) LOCAL;
-- 2. 创建 Global 索引,varchar 不支持 HASH,但是可通过 KEY 序列化转换成 HASH
CREATE INDEX I2 ON T1(c3) GLOBAL PARTITION BY KEY (c3) PARTITIONS 8;
-- 3. 查看指定表的索引及类型
SELECT DISTINCT
T1.INDEX_NAME,
T1.TABLE_NAME AS INDEX_TABLE_NAME,
T1.TABLE_ID AS INDEX_TABLE_ID,
T1.DATA_TABLE_ID AS PRIMARY_TABLE_ID,
T1.INDEX_TYPE
FROM oceanbase.DBA_OB_TABLE_LOCATIONS T1
JOIN oceanbase.DBA_OB_TABLE_LOCATIONS T2
ON T1.DATA_TABLE_ID = T2.TABLE_ID
WHERE T2.DATABASE_NAME = 'test'
AND T2.TABLE_NAME = 't1';
+------------+------------------+----------------+------------------+------------+
| INDEX_NAME | INDEX_TABLE_NAME | INDEX_TABLE_ID | PRIMARY_TABLE_ID | INDEX_TYPE |
+------------+------------------+----------------+------------------+------------+
| I1 | __idx_500049_I1 | 500062 | 500049 | LOCAL |
| I2 | __idx_500049_I2 | 500071 | 500049 | GLOBAL |
+------------+------------------+----------------+------------------+------------+
-- 4. 查看索引副本/Leader 分布
SELECT
INDEX_NAME,
PARTITION_NAME,
SUBPARTITION_NAME,
TABLET_ID,
LS_ID,
ZONE,
SVR_IP,
SVR_PORT,
ROLE,
REPLICA_TYPE
FROM oceanbase.DBA_OB_TABLE_LOCATIONS
WHERE TABLE_TYPE = 'INDEX'
AND DATA_TABLE_ID = (SELECT DISTINCT TABLE_ID
FROM oceanbase.DBA_OB_TABLE_LOCATIONS
WHERE DATABASE_NAME='test'
AND TABLE_NAME='t1'
AND TABLE_TYPE='USER TABLE')
ORDER BY INDEX_NAME, PARTITION_NAME, ROLE DESC;
+------------+----------------+-------------------+---------------------+-------+-------+----------------+----------+----------+--------------+
| INDEX_NAME | PARTITION_NAME | SUBPARTITION_NAME | TABLET_ID | LS_ID | ZONE | SVR_IP | SVR_PORT | ROLE | REPLICA_TYPE |
+------------+----------------+-------------------+---------------------+-------+-------+----------------+----------+----------+--------------+
| I1 | p0 | NULL | 1152921504606846999 | 1 | zone1 | 192.168.182.21 | 2882 | LEADER | FULL |
| I1 | p0 | NULL | 1152921504606846999 | 1 | zone3 | 192.168.182.23 | 2882 | FOLLOWER | FULL |
| I1 | p0 | NULL | 1152921504606846999 | 1 | zone2 | 192.168.182.22 | 2882 | FOLLOWER | FULL |
| I1 | p1 | NULL | 1152921504606847000 | 1 | zone1 | 192.168.182.21 | 2882 | LEADER | FULL |
| I1 | p1 | NULL | 1152921504606847000 | 1 | zone3 | 192.168.182.23 | 2882 | FOLLOWER | FULL |
| I1 | p1 | NULL | 1152921504606847000 | 1 | zone2 | 192.168.182.22 | 2882 | FOLLOWER | FULL |
| I1 | p2 | NULL | 1152921504606847001 | 1 | zone1 | 192.168.182.21 | 2882 | LEADER | FULL |
| I1 | p2 | NULL | 1152921504606847001 | 1 | zone3 | 192.168.182.23 | 2882 | FOLLOWER | FULL |
| I1 | p2 | NULL | 1152921504606847001 | 1 | zone2 | 192.168.182.22 | 2882 | FOLLOWER | FULL |
| I1 | p3 | NULL | 1152921504606847002 | 1 | zone1 | 192.168.182.21 | 2882 | LEADER | FULL |
| I1 | p3 | NULL | 1152921504606847002 | 1 | zone3 | 192.168.182.23 | 2882 | FOLLOWER | FULL |
| I1 | p3 | NULL | 1152921504606847002 | 1 | zone2 | 192.168.182.22 | 2882 | FOLLOWER | FULL |
| I1 | p4 | NULL | 1152921504606847003 | 1 | zone1 | 192.168.182.21 | 2882 | LEADER | FULL |
| I1 | p4 | NULL | 1152921504606847003 | 1 | zone3 | 192.168.182.23 | 2882 | FOLLOWER | FULL |
| I1 | p4 | NULL | 1152921504606847003 | 1 | zone2 | 192.168.182.22 | 2882 | FOLLOWER | FULL |
| I1 | p5 | NULL | 1152921504606847004 | 1 | zone1 | 192.168.182.21 | 2882 | LEADER | FULL |
| I1 | p5 | NULL | 1152921504606847004 | 1 | zone3 | 192.168.182.23 | 2882 | FOLLOWER | FULL |
| I1 | p5 | NULL | 1152921504606847004 | 1 | zone2 | 192.168.182.22 | 2882 | FOLLOWER | FULL |
| I2 | p0 | NULL | 1152921504606847005 | 1 | zone1 | 192.168.182.21 | 2882 | LEADER | FULL |
| I2 | p0 | NULL | 1152921504606847005 | 1 | zone2 | 192.168.182.22 | 2882 | FOLLOWER | FULL |
| I2 | p0 | NULL | 1152921504606847005 | 1 | zone3 | 192.168.182.23 | 2882 | FOLLOWER | FULL |
| I2 | p1 | NULL | 1152921504606847006 | 1 | zone1 | 192.168.182.21 | 2882 | LEADER | FULL |
| I2 | p1 | NULL | 1152921504606847006 | 1 | zone3 | 192.168.182.23 | 2882 | FOLLOWER | FULL |
| I2 | p1 | NULL | 1152921504606847006 | 1 | zone2 | 192.168.182.22 | 2882 | FOLLOWER | FULL |
| I2 | p2 | NULL | 1152921504606847007 | 1 | zone1 | 192.168.182.21 | 2882 | LEADER | FULL |
| I2 | p2 | NULL | 1152921504606847007 | 1 | zone3 | 192.168.182.23 | 2882 | FOLLOWER | FULL |
| I2 | p2 | NULL | 1152921504606847007 | 1 | zone2 | 192.168.182.22 | 2882 | FOLLOWER | FULL |
| I2 | p3 | NULL | 1152921504606847008 | 1 | zone1 | 192.168.182.21 | 2882 | LEADER | FULL |
| I2 | p3 | NULL | 1152921504606847008 | 1 | zone3 | 192.168.182.23 | 2882 | FOLLOWER | FULL |
| I2 | p3 | NULL | 1152921504606847008 | 1 | zone2 | 192.168.182.22 | 2882 | FOLLOWER | FULL |
| I2 | p4 | NULL | 1152921504606847009 | 1 | zone1 | 192.168.182.21 | 2882 | LEADER | FULL |
| I2 | p4 | NULL | 1152921504606847009 | 1 | zone3 | 192.168.182.23 | 2882 | FOLLOWER | FULL |
| I2 | p4 | NULL | 1152921504606847009 | 1 | zone2 | 192.168.182.22 | 2882 | FOLLOWER | FULL |
| I2 | p5 | NULL | 1152921504606847010 | 1 | zone1 | 192.168.182.21 | 2882 | LEADER | FULL |
| I2 | p5 | NULL | 1152921504606847010 | 1 | zone3 | 192.168.182.23 | 2882 | FOLLOWER | FULL |
...
42 rows in set (0.052 sec)
总共 42 行:
- 其中 I1 索引为
LOCAL索引,和表分区数量相同,因此也是 6 个分区,每个索引 1Leader+ 2Follower,总共是 18 条数据; - I2 索引为
Global索引,分区数量可以和表不同,创建时指定了 8 个分区,因此是 24 条数据。
分区与分片内容不多,今天的主要时间花在总结上,明天重点介绍 OceanBase 的数据副本和日志流,这既是重点,也是是 OBCP 的常考点。
如果本文对你有所帮助,欢迎点赞、推荐和转发,也欢迎关注后续文章,一起学习 OceanBase 分布式数据库。