业务租户查出来的tenant_id不一致是为什么?

【 使用环境 】 测试环境
【 OB or 其他组件 】OB
【 使用版本 】
【问题描述】业务租户查出来的tenant_id不一致是为什么?
【复现路径】问题出现前后相关操作
【附件及日志】推荐使用OceanBase敏捷诊断工具obdiag收集诊断信息,详情参见链接(右键跳转查看):

【SOP系列 22 】——故障诊断第一步(自助诊断和诊断信息收集)

【备注】基于 LLM 和开源文档 RAG 的论坛小助手已开放测试,在发帖时输入 [@论坛小助手] 即可召唤小助手,欢迎试用!
@论坛小助手

MySQL [test]> select tenant_id,table_id,table_name,database_id from oceanbase.__all_virtual_table where table_name =‘james’\G
*************************** 1. row ***************************
tenant_id: 1002
table_id: 500085
table_name: james
database_id: 500001
1 row in set (0.007 sec)

MySQL [test]> select tenant_id,table_id,table_name,database_id from oceanbase.__all_table where table_name =‘james’\G
*************************** 1. row ***************************
tenant_id: 0
table_id: 500085
table_name: james
database_id: 500001
1 row in set (0.005 sec)

用户问题总结:OceanBase 业务租户查询出来的 tenant_id 不一致,需要分析原因。

在这种情况下,我们可以通过采集集群基础信息来排查问题。推荐使用 obdiag 工具进行日志采集,并将采集到的日志提供给我们以便确认问题所在。

日志采集场景: 集群基础信息
日志采集命令: obdiag gather scene run --scene=observer.base

为了更好地帮助您解决问题,请您执行上述命令并将生成的日志压缩包提供给我们。同时,请回答以下问题以便我们获取更多有助于诊断的信息:

  1. 您是否在同一时间从不同的客户端或连接查询了 tenant_id?如果是,请描述这些客户端的连接方式和配置。
  2. 查询 tenant_id 的 SQL 语句是什么?是否有指定具体的租户或者数据库?
  3. 您是否对 OceanBase 集群进行了任何配置更改或操作(如切换主备、重启节点等)?
  4. 是否存在多租户环境?如果存在,请说明当前查询涉及的是哪个租户。
  5. 您能否提供查询结果不一致的具体示例(例如,不同查询返回的 tenant_id 值)?

附上敏捷诊断工具 obdiag 使用帮助链接

MySQL [test]> select tenant_id,table_id,table_name,database_id from oceanbase.__all_virtual_table where table_name =‘james’\G
*************************** 1. row ***************************
tenant_id: 1002
table_id: 500085
table_name: james
database_id: 500001
1 row in set (0.007 sec)

MySQL [test]> select tenant_id,table_id,table_name,database_id from oceanbase.__all_table where table_name =‘james’\G
*************************** 1. row ***************************
tenant_id: 0
table_id: 500085
table_name: james
database_id: 500001
1 row in set (0.005 sec)

根据您提供的查询结果,我们可以看到在不同的系统表中查询同一张表 james 时,tenant_id 的值不一致。具体表现为:

  • oceanbase.__all_virtual_table 中查询到的 tenant_id1002
  • oceanbase.__all_table 中查询到的 tenant_id0

分析原因

  1. 系统表的作用与区别

    • __all_virtual_table 是 OceanBase 数据库中的虚拟表,通常用于展示当前租户视角下的元数据信息。这里的 tenant_id 表示的是当前查询所在的租户 ID。
    • __all_table 是 OceanBase 数据库中的基础元数据表,存储了整个集群范围内的表信息。这里的 tenant_id = 0 表示该记录是全局可见的,或者说是从系统级别的视角来看的。
  2. 查询上下文的影响

    • 当您查询 __all_virtual_table 时,查询是在当前租户(test)的上下文中执行的,因此返回的 tenant_id 是当前租户的 ID(即 1002)。
    • 当您查询 __all_table 时,查询是从全局视角出发的,因此返回的 tenant_id0,表示这是一个全局记录。
  3. 正常现象

    • 这种差异是正常的,因为 __all_virtual_table__all_table 的设计目的不同。前者是租户级视图,后者是全局元数据表。

结论

根据文档库中的信息,这种 tenant_id 不一致的现象是由于查询的系统表不同导致的,并且是预期的行为。如果您需要确认当前租户的 tenant_id,可以通过以下方式查询:

SELECT tenant_id FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME = 'test';

依据的文档名称及段落标题:

  • 查询租户基本信息:oceanbase.DBA_OB_TENANTS -> 查询示例

如果仍有疑问,请提供更多上下文信息,例如当前连接的租户名称和具体的业务场景,以便进一步分析。

详情请参考:

  1. oceanbase.CDB_OB_TABLE_LOCATIONS
  2. oceanbase.DBA_OB_SERVICES
  3. oceanbase.CDB_WR_SQLTEXT
  4. oceanbase.CDB_OB_SERVICES
  5. oceanbase.CDB_OBJECTS
  6. oceanbase.DBA_OB_TENANTS
  7. oceanbase.DBA_WR_SQLTEXT
  8. oceanbase.CDB_OB_ACCESS_POINT

(小助手的答复已结束,如未能解决您的问题,请继续提问并等待其他同学的回复,谢谢!)

1 个赞

这怎么是预期的呢? 从哪个角度看租户id也不应该是0

根据这个视图查一下 业务租户的id
select * FROM oceanbase.dba_ob_tenants

业务租户ID 从__all_virtual_table查询的没问题

查的不是一个东西

自己创建个业务租户试试 ,出来的都是我查询的那个结果。

查的不是一个东西

__all_table是租户下的表,租户下的一般都不能编码tenant_id信息。这属于历史遗留的问题