如何查看 OceanBase 集群中主副本分布,写出查询视图。

如何查看 OceanBase 集群中主副本分布,写出查询视图。

OceanBase 里“主副本”通常指 Leader 副本 ,也就是负责写请求和强一致性读的副本。
查看主副本分布时,4.x 版本优先用 DBA_OB_* / CDB_OB_* 视图 ,不要直接依赖 __all_virtual_* 内部表。

4.x 推荐视图

表格

视图 适用租户 用途
DBA_OB_TABLE_LOCATIONS 普通租户 查看表/分区的副本分布、ROLE 是否为 LEADER
CDB_OB_TABLE_LOCATIONS sys 租户 查看所有租户的表/分区副本分布
DBA_OB_LS_LOCATIONS / CDB_OB_LS_LOCATIONS 普通租户 / sys 租户 查看日志流副本分布,日志流层面也有 Leader/Follower
DBA_OB_TABLET_REPLICAS / CDB_OB_TABLET_REPLICAS 普通租户 / sys 租户 查看 Tablet 副本状态、大小、角色等详细信息

常用查询示例

1. 查看某张表的主副本分布

sql

编辑

SELECT DATABASE_NAME,
       TABLE_NAME,
       SVR_IP,
       SVR_PORT,
       ZONE,
       ROLE,
       LS_ID,
       TABLET_ID
FROM   oceanbase.DBA_OB_TABLE_LOCATIONS
WHERE  DATABASE_NAME = 'your_db'
  AND  TABLE_NAME    = 'your_table'
  AND  ROLE          = 'LEADER';

2. 按节点统计某租户的 Leader 分布

sql

编辑

SELECT ZONE,
       SVR_IP,
       COUNT(*) AS leader_count
FROM   oceanbase.CDB_OB_TABLE_LOCATIONS
WHERE  TENANT_ID = 1001
  AND  ROLE      = 'LEADER'
GROUP BY ZONE, SVR_IP
ORDER BY ZONE, SVR_IP;

3. 查看某张表的完整副本分布

sql

编辑

SELECT t1.DATABASE_NAME,
       t1.TABLE_NAME,
       t1.SVR_IP,
       t1.SVR_PORT,
       t1.ZONE,
       t1.ROLE,
       t2.REPLICA_TYPE,
       t2.REPLICA_STATUS
FROM   oceanbase.DBA_OB_TABLE_LOCATIONS t1
JOIN   oceanbase.DBA_OB_TABLET_REPLICAS t2
  ON   t1.TENANT_ID = t2.TENANT_ID
 AND   t1.LS_ID     = t2.LS_ID
 AND   t1.TABLET_ID = t2.TABLET_ID
 AND   t1.SVR_IP    = t2.SVR_IP
 AND   t1.SVR_PORT  = t2.SVR_PORT
WHERE  t1.DATABASE_NAME = 'your_db'
  AND  t1.TABLE_NAME    = 'your_table';

3.x 老版本可用视图

如果是 3.x 版本 ,可以查:

sql

编辑

SELECT TENANT_ID,
       TABLE_ID,
       PARTITION_ID,
       SVR_IP,
       ZONE,
       ROLE
FROM   oceanbase.__ALL_VIRTUAL_META_TABLE
WHERE  TABLE_ID = :table_id
  AND  ROLE     = 1;

其中 ROLE = 1 表示 Leader。

实际使用时,如果集群是 4.x,建议优先用 CDB_OB_TABLE_LOCATIONS / DBA_OB_TABLE_LOCATIONS ;如果是 3.x,再用 __ALL_VIRTUAL_META_TABLE 。