基本信息
- 测试环境
- 主备架构
- 问题描述
- 3.x版本主备是集群模式,有v$ob_cluster这类视图能看主备之间的状态和关系,4.x我知道有一个dba_ob_tenants视图能看租户的主备角色(TENANT_ROLE字段),但没法看到这个备租户对应的主租户是哪一个,咨询下社区,还有其他视图能关联查询到吗主备租户之间的关系吗。
-- 主租户
obclient [oceanbase]> select * from dba_ob_tenants\G
*************************** 1. row ***************************
TENANT_ID: 1006
TENANT_NAME: ob_master_mysql
TENANT_TYPE: USER
CREATE_TIME: 2025-02-24 15:36:08.290707
MODIFY_TIME: 2025-02-24 15:36:20.148844
PRIMARY_ZONE: RANDOM
LOCALITY: FULL{1}@zone1
PREVIOUS_LOCALITY: NULL
COMPATIBILITY_MODE: MYSQL
STATUS: NORMAL
IN_RECYCLEBIN: NO
LOCKED: NO
TENANT_ROLE: PRIMARY
SWITCHOVER_STATUS: NORMAL
SWITCHOVER_EPOCH: 1740388998019850
SYNC_SCN: 1742523873766735581
REPLAYABLE_SCN: 1742523873766735581
READABLE_SCN: 1742523873766735580
RECOVERY_UNTIL_SCN: 4611686018427387903
LOG_MODE: ARCHIVELOG
ARBITRATION_SERVICE_STATUS: DISABLED
UNIT_NUM: 1
COMPATIBLE: 4.2.1.9
MAX_LS_ID: 1001
1 row in set (0.003 sec)
-- 备租户
obclient [oceanbase]> select * from dba_ob_tenants\G
*************************** 1. row ***************************
TENANT_ID: 1008
TENANT_NAME: ob_slave_mysql
TENANT_TYPE: USER
CREATE_TIME: 2025-02-25 16:05:59.234424
MODIFY_TIME: 2025-02-25 16:06:17.923541
PRIMARY_ZONE: RANDOM
LOCALITY: FULL{1}@zone1
PREVIOUS_LOCALITY: NULL
COMPATIBILITY_MODE: MYSQL
STATUS: NORMAL
IN_RECYCLEBIN: NO
LOCKED: NO
TENANT_ROLE: STANDBY
SWITCHOVER_STATUS: NORMAL
SWITCHOVER_EPOCH: 0
SYNC_SCN: 1742523991897528029
REPLAYABLE_SCN: 1742523991897528029
READABLE_SCN: 1742523991397000147
RECOVERY_UNTIL_SCN: 4611686018427387903
LOG_MODE: ARCHIVELOG
ARBITRATION_SERVICE_STATUS: DISABLED
UNIT_NUM: 1
COMPATIBLE: 4.2.1.9
MAX_LS_ID: 1001
1 row in set (0.022 sec)
论坛小助手
#4
根据文档库中的信息,4.x 版本的 OceanBase 数据库确实可以通过 DBA_OB_TENANTS
视图查看租户的角色(通过 TENANT_ROLE
字段),但目前没有直接提供一个视图来显示主备租户之间的关联关系。
问题分析
在 3.x 版本中,可以通过 v$ob_cluster
视图查看主备集群之间的状态和关系。而在 4.x 版本中,虽然可以通过 DBA_OB_TENANTS
视图查看租户的角色(PRIMARY
或 STANDBY
),但无法直接从该视图中获取主租户与备租户之间的对应关系。
解决方案
尽管没有直接的视图可以显示主备租户之间的关联关系,但可以通过以下方式间接查询:
-
通过 SYNC_SCN
字段关联主备租户
在 DBA_OB_TENANTS
视图中,SYNC_SCN
字段表示当前租户同步到的 SCN(System Change Number)。主租户和备租户的 SYNC_SCN
值通常是相关的。可以通过比较不同租户的 SYNC_SCN
值来推测主备租户的关系。
SELECT TENANT_NAME, TENANT_ROLE, SYNC_SCN
FROM DBA_OB_TENANTS;
输出示例:
+----------------+-------------+------------------+
| TENANT_NAME | TENANT_ROLE | SYNC_SCN |
+----------------+-------------+------------------+
| ob_master_mysql| PRIMARY | 1742523873766735581 |
| ob_slave_mysql | STANDBY | 1742523991897528029 |
+----------------+-------------+------------------+
如果两个租户的 SYNC_SCN
值接近,则可以推测它们之间存在主备关系。
-
通过 SWITCHOVER_STATUS
和 SWITCHOVER_EPOCH
字段
SWITCHOVER_STATUS
字段表示切换状态,SWITCHOVER_EPOCH
字段表示切换的时间戳。主租户和备租户的这些字段值通常是一致的。可以通过以下 SQL 查询:
SELECT TENANT_NAME, TENANT_ROLE, SWITCHOVER_STATUS, SWITCHOVER_EPOCH
FROM DBA_OB_TENANTS;
输出示例:
+----------------+-------------+-------------------+---------------------+
| TENANT_NAME | TENANT_ROLE | SWITCHOVER_STATUS| SWITCHOVER_EPOCH |
+----------------+-------------+-------------------+---------------------+
| ob_master_mysql| PRIMARY | NORMAL | 1740388998019850 |
| ob_slave_mysql | STANDBY | NORMAL | 1740388998019850 |
+----------------+-------------+-------------------+---------------------+
如果两个租户的 SWITCHOVER_STATUS
和 SWITCHOVER_EPOCH
值一致,则可以推测它们之间存在主备关系。
-
通过日志或配置文件
主备租户的关系也可以通过日志或配置文件进行确认。例如,在创建备租户时,通常会指定主租户的信息。可以通过检查相关日志或配置文件来确认主备租户的对应关系。
总结
目前 4.x 版本的 OceanBase 数据库没有直接提供一个视图来显示主备租户之间的关联关系,但可以通过以下方式间接查询:
- 比较
SYNC_SCN
值。
- 检查
SWITCHOVER_STATUS
和 SWITCHOVER_EPOCH
字段。
- 查看日志或配置文件。
如果需要更直观的方式查看主备租户的关系,建议提交功能需求至 OceanBase 社区,以便后续版本中增加相关功能支持。
检索到的文档如下:
- 使用命令行进行运维
- 查看 OceanBase 集群资源的使用情况
- 使用 MySQL 租户做常见数据库开发
- 连接租户
- ODP SQL 路由原理
- 管理 OceanBase 数据库连接
助手给的回答都是预计或人工判断主从角色,好像没有一个通过SQL或者类似的方式能直接关联查询出来的方式
我能找到的一个从库查看主库信息的方式,不一定对,但能关联上
-- 在从库查询
SELECT T1.TENANT_ID,
T1.TENANT_NAME,
T1.TENANT_TYPE,
T1.COMPATIBILITY_MODE,
T1.STATUS,
T1.TENANT_ROLE,
T1.SWITCHOVER_STATUS,
T2.VALUE AS PRIMARY_CONN_INFO
FROM OCEANBASE.DBA_OB_TENANTS T1
INNER JOIN OCEANBASE.CDB_OB_LOG_RESTORE_SOURCE T2
ON T1.TENANT_ID = T2.TENANT_ID
WHERE 1 = 1
AND T1.TENANT_TYPE = 'USER'
-- 输出的信息能看到主库IP、TENANT_ID和CLUSTER_ID的信息
*************************** 1. row ***************************
TENANT_ID: 1008
TENANT_NAME: ob_slave_mysql
TENANT_TYPE: USER
COMPATIBILITY_MODE: MYSQL
STATUS: NORMAL
TENANT_ROLE: STANDBY
SWITCHOVER_STATUS: NORMAL
PRIMARY_CONN_INFO: IP_LIST=10.186.58.15:2881,USER=STANDBYRO@ob_master_mysql,PASSWORD=AF2F444953B4785B4AFC98938496344CEB1D4216062EC727BDF0B691B2A074FF,TENANT_ID=1006,CLUSTER_ID=1740105588,COMPATIBILITY_MODE=MYSQL,IS_ENCRYPTED=true
1 row in set (0.037 sec)
淇铭
#7
除了一个查看租户视图DBA_OB_TENANTS和CDB_OB_LOG_RESTORE_SOURCE日志流信息的视图 没有一个视图能查看其对应主备租户角色的视图
DBA_OB_TENANTS 这个视图 可以分别在主备上查看角色信息
CDB_OB_LOG_RESTORE_SOURCE 这个查看备库日志恢复源信息的
找了一个主库和备库有关联信息的地方,备库会有一个STANDBYRO用户定期往主库发状态查询的SQL
-- 备库这个用户持续执行下面的SQL做主库状态采集
obclient [oceanbase]> select distinct SVR_IP,TENANT_NAME,USER_NAME,QUERY_SQL from gv$ob_sql_audit where USER_NAME = 'STANDBYRO';
+--------------+-----------------+-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+
| SVR_IP | TENANT_NAME | USER_NAME | QUERY_SQL |
+--------------+-----------------+-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 10.186.58.15 | ob_master_mysql | STANDBYRO | SELECT SVR_IP, SVR_PORT, ROLE, BEGIN_LSN, END_LSN FROM GV$OB_LOG_STAT WHERE tenant_id = 1006 AND ls_id = 1 ORDER BY tenant_id, ls_id, svr_ip, svr_port ASC |
| 10.186.58.15 | ob_master_mysql | STANDBYRO | SELECT SVR_IP, SVR_PORT, ROLE, BEGIN_LSN, END_LSN FROM GV$OB_LOG_STAT WHERE tenant_id = 1006 AND ls_id = 1001 ORDER BY tenant_id, ls_id, svr_ip, svr_port ASC |
| 10.186.58.15 | ob_master_mysql | STANDBYRO | SELECT SVR_IP, SVR_PORT, ZONE, ZONE_TYPE, REGION FROM GV$OB_UNITS WHERE tenant_id = 1006 |
| 10.186.58.15 | ob_master_mysql | STANDBYRO | SELECT VALUE FROM GV$OB_PARAMETERS WHERE NAME='cluster_id' |
| 10.186.58.15 | ob_master_mysql | STANDBYRO | SELECT TENANT_ID FROM DBA_OB_TENANTS WHERE TENANT_NAME='ob_master_mysql' |
| 10.186.58.15 | ob_master_mysql | STANDBYRO | SELECT SVR_IP, SQL_PORT AS SVR_PORT FROM DBA_OB_ACCESS_POINT WHERE TENANT_ID=1006 |
+--------------+-----------------+-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+
6 rows in set (0.016 sec)
-- 基于processlist中这个用户的信息能初步从主库的视角判断是否有备库以及备库的IP地址
SELECT DISTINCT SUBSTRING_INDEX(T2.HOST, ':', 1) AS STANDBY_HOST,
T2.USER STANDBY_USER,
T2.TENANT PRIMARY_TENANT,
T1.TENANT_ID AS PRIMARY_TENANT_ID,
T1.STATUS AS PRIMARY_STATUS,
T1.COMPATIBILITY_MODE
FROM OCEANBASE.DBA_OB_TENANTS T1
INNER JOIN OCEANBASE.GV$OB_PROCESSLIST T2
ON T1.TENANT_NAME = T2.TENANT
WHERE 1 = 1
AND T1.TENANT_TYPE = 'USER'
AND T2.USER = 'STANDBYRO'
*************************** 1. row ***************************
STANDBY_HOST: 10.186.58.16
STANDBY_USER: STANDBYRO
PRIMARY_TENANT: ob_master_mysql
PRIMARY_TENANT_ID: 1006
PRIMARY_STATUS: NORMAL
COMPATIBILITY_MODE: MYSQL
1 row in set (0.010 sec)
补充:基于归档日志的物理备库可能没法基于processlist观测关系,主备之间网络不一定连通
1、DBA_OB_TENANTS 可以监控主备租户的状态和同步进度。
2、主租户负责生成和归档 Redo 日志,但无法直接感知备租户的存在。
3、备租户通过配置日志恢复源,从主租户的日志归档中读取并应用日志,从而实现数据同步。