如何查看同一个集群grid 下 A租户database a 和 B租户database b 和c 租户 database c 的各自的大小?

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

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

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

如何一条 SQL查看同一个集群grid 下 A租户database a 和 B租户database b 和c 租户 database c 的各自的total 大小?

1 个赞

您的问题是在生产环境中,希望使用一条SQL语句来查询同一个OceanBase集群下的不同租户(A租户database a、B租户database b、C租户database c)各自的总大小。这个问题涉及到跨租户的数据统计,OceanBase数据库默认并没有提供直接跨租户查询的机制,因为每个租户的数据都是逻辑隔离的。

不过,您可以通过一些间接的方式来实现这个需求。一种可行的方法是分别在每个租户中执行查询其数据库大小的SQL,并将结果汇总。具体来说,您可以先在每个租户中查询其数据库的大小,然后再通过某种方式(如脚本或应用程序逻辑)将这些结果合并起来。

对于查询单个租户数据库的大小,OceanBase提供了系统视图来查看表空间的使用情况,例如 oceanbase.DBA_DATAFILES 可以用来查看数据文件的大小。但是,要获取整个租户的总大小,您可能需要结合其他视图或者使用一些聚合函数。

由于没有直接的跨租户查询功能,这里提供一个示例查询,展示如何在一个租户内查询其数据库的大小:

SELECT SUM(bytes) AS total_size
FROM oceanbase.DBA_DATAFILES
WHERE status = 'ONLINE';

这条SQL语句会返回该租户所有在线数据文件的总大小。

为了实现您的需求,您需要在每个租户中执行类似的查询,并将结果汇总。这通常需要编写一个脚本来自动执行这些步骤。

如果您确实需要一条SQL语句来完成这个任务,那么在当前OceanBase版本中这是不可行的,因为涉及到跨租户查询。建议您联系OceanBase的技术支持团队,看看是否有更高级的解决方案或者工具能够满足您的需求。

总结一下,目前OceanBase不支持直接跨租户查询,您需要在每个租户中单独查询然后汇总结果。如果需要进一步的帮助,建议联系OceanBase的技术支持。

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

2 个赞

我想在集群级别,查询A租户的数据库A 的大小,SQL 是否可以提供?

2 个赞

要在集群级别查询特定租户(例如A租户)的数据库大小,您可以通过查询OceanBase的系统视图来获取相关信息。OceanBase提供了多个系统视图来监控和管理数据库资源,包括表空间和数据文件的使用情况。

为了获取A租户数据库的大小,您可以查询oceanbase.DBA_DATAFILES视图,该视图包含了所有在线数据文件的信息。下面是一个示例SQL查询,用于获取A租户数据库的总大小:

SELECT SUM(bytes) AS total_size
FROM oceanbase.DBA_DATAFILES
WHERE tenant_id = (SELECT tenant_id FROM oceanbase.__all_tenant WHERE tenant_name = 'A租户');

这条SQL语句的关键在于:

  1. 使用oceanbase.DBA_DATAFILES视图来获取数据文件的大小信息。
  2. 通过tenant_id来筛选出属于A租户的数据文件。
  3. 使用SUM(bytes)来计算所有数据文件的总大小。

请注意,tenant_id是租户的唯一标识符,您需要先确定A租户的tenant_id。上面的查询中使用了子查询(SELECT tenant_id FROM oceanbase.__all_tenant WHERE tenant_name = 'A租户')来获取A租户的tenant_id

如果您已经知道A租户的具体tenant_id,可以直接替换上述查询中的子查询部分,以提高查询效率。

此外,您还可以查询oceanbase.DBA_TABLESPACES视图来获取表空间的信息,这对于理解数据库的整体存储布局也很有帮助。

综上所述,您可以使用如下SQL语句来查询A租户数据库的总大小:

SELECT SUM(bytes) AS total_size
FROM oceanbase.DBA_DATAFILES
WHERE tenant_id = (SELECT tenant_id FROM oceanbase.__all_tenant WHERE tenant_name = 'A租户');

请注意,这里的'A租户'应该替换为您实际的租户名称。如果租户名称中包含特殊字符或空格,请确保正确地使用引号包裹租户名称。

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

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

1 个赞

oceanbase.DBA_DATAFILES 这个表没有?
ErrorCode = 1146, SQLState = 42S02, Details = Table ‘oceanbase.DBA_DATAFILES’ doesn’t exist

1 个赞


小助手可能回复的是ORACLE模式方法,你可以使用ocp去查看每个租户的数据库大小

mysql 模式如何用 sql 实现?

1 个赞

每个租户的数据都是隔离的,这边翻看了一下文档应该是查不了。

1 个赞

也就是我要进入每一个租户查看,查看该租户的数据量,那么请给出登陆租户后,查询数据量的方法,sql实现?

默认情况下统计的是三/多副本的大小,可以通过增加 role 来获取单副本大小。

统计租户的大小

select t.tenant_name,
round(sum(t2.data_size)/1024/1024/1024,2) as data_size_gb,
round(sum(t2.required_size)/1024/1024/1024,2) as required_size_gb
from dba_ob_tenants t,cdb_ob_table_locations t1,cdb_ob_tablet_replicas t2
where t.tenant_id=t1.tenant_id
and t1.svr_ip=t2.svr_ip
and t1.tenant_id=t2.tenant_id
and t1.ls_id=t2.ls_id
and t1.tablet_id=t2.tablet_id
-- and t1.role='leader'
group by t.tenant_name
order by 3 desc;
2 个赞

谢谢,发现带入条件role= 这个参数,SQL 性能变得很差 ,大概10分钟没结果。
如果不带入条件role= 这个参数,SQL 可以在秒级别完成,

1 个赞

可以查看执行计划对比看看是哪一步耗时长

notepad.txt (35.7 KB)
sql 执行计划如上,请查收

已经上传

还有一条sql的执行计划

good_sql_plan.txt (33.1 KB)

已经上传good plan

第一个执行计划变成分布式计划了,所以导致很慢,应该是因为leader条件导致

issue_plan.txt (67.2 KB)

good_sql_plan.txt (49.0 KB)

1、从哪里可以看出执行计划变成分布式计划,
2.如何优化使得SQL 速度能提高?

上面发的文件最下面有写sql type
你这不是系统表sql么,设置sys租户的优先级,且这种非业务sql 快慢并不会产生其他影响