一条SQL 返回当前集群 下有多少个租户,以及各个租户下对应的数据库名称

【 使用环境 】生产环境 or 测试环境 生产
【 OB or 其他组件 】 4.0
【 使用版本 】
【问题描述】清晰明确描述问题
【复现路径】问题出现前后相关操作
【附件及日志】推荐使用OceanBase敏捷诊断工具obdiag收集诊断信息,详情参见链接(右键跳转查看):

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

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

问题:一条SQL 返回当前集群 下有多少个租户,以及各个租户下对应的数据库名称

根据文档库中的信息,您可以使用以下 SQL 查询来获取当前集群下有多少个租户,以及各个租户下对应的数据库名称。

1. 查询当前集群中所有租户的数量及详细信息

要查询当前集群中所有租户的详细信息(包括租户 ID 和租户名称),可以执行如下 SQL:

SELECT tenant_id, tenant_name 
FROM oceanbase.gv$tenant;

这将返回类似如下的结果:

+-----------+-------------+
| tenant_id | tenant_name |
+-----------+-------------+
|         1 | sys         |
|      1001 | mysql001    |
|      1002 | oracle001   |
+-----------+-------------+

2. 查询每个租户下的数据库名称

对于 MySQL 模式的租户,可以通过查询 information_schema.databases 来获取该租户下的数据库名称。对于 Oracle 模式的租户,则需要查询 dba_users 或者 all_users 视图来获取相关信息。这里我们假设您主要关心 MySQL 模式的租户。

对于 MySQL 模式的租户:

SELECT tenant_name, database_name
FROM (
  SELECT tenant_id, tenant_name FROM oceanbase.gv$tenant WHERE compatibility_mode = 'MySQL'
) AS tenants
JOIN information_schema.schemata ON tenants.tenant_id = DATABASE_ID();

请注意,上述 SQL 中的 DATABASE_ID() 函数是假设性的,实际环境中可能需要根据具体版本和配置调整为正确的字段或视图连接方式。如果您的环境中没有直接提供这样的映射关系,您可能需要通过其他管理工具(如 OCP)来获取更详细的租户与数据库映射信息。

综合查询

如果您希望一次性获取所有租户及其对应的数据库名称,可以尝试结合上面两个查询。但需要注意的是,由于不同模式(MySQL/Oracle)的租户在内部表示上有所区别,因此可能无法用一条通用的 SQL 完全覆盖所有情况。对于特定模式的租户,建议分别编写针对性的查询语句。

以上信息来源于对多租户特性的描述(参见“OceanBase 数据库整体架构 → 多租户层”章节)以及如何查询租户信息的相关内容。

如果上述方法不能满足需求,或者您遇到了具体的错误提示,请提供更多详细信息以便进一步帮助您解决问题。

具体信息可参考以下文档:

  1. 统计信息收集监控诊断
  2. 租户的资源管理
  3. gv$tenant
  4. 快速入门系列教程
  5. 查询集群信息
  6. OceanBase 术语
  7. OceanBase 数据库整体架构
  8. 查看 OceanBase 集群资源的使用情况
  9. 查找某个租户中执行全表扫描的 SQL
  10. 租户管理

你好,登入root@sys
SELECT
t.tenant_id,
t.tenant_name,
COUNT(d.database_name) AS database_count,
GROUP_CONCAT(d.database_name) AS database_names
FROM
oceanbase.DBA_OB_TENANTS t
LEFT JOIN
oceanbase.CDB_OB_DATABASES d
ON
t.tenant_id = d.tenant_id
GROUP BY
t.tenant_id, t.tenant_name;

  • tenant_id:租户的唯一标识。
  • tenant_name:租户的名称。
  • database_count:该租户下的数据库数量。
  • database_names:该租户下的数据库名称列表,以逗号分隔。

你好,登入root@sys
SELECT
t.tenant_id,
t.tenant_name,
COUNT(d.database_name) AS database_count,
GROUP_CONCAT(d.database_name) AS database_names
FROM
oceanbase.DBA_OB_TENANTS t
LEFT JOIN
oceanbase.CDB_OB_DATABASES d
ON
t.tenant_id = d.tenant_id
GROUP BY
t.tenant_id, t.tenant_name;

  • tenant_id:租户的唯一标识。
  • tenant_name:租户的名称。
  • database_count:该租户下的数据库数量。
  • database_names:该租户下的数据库名称列表,以逗号分隔。