sql可以统计当前某个租户的对应的每个数据库大小(leader)

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

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

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

问题1:
一条sql可以统计当前某个租户的对应的每个数据库大小(leader)

select t1.database_name,t.tenant_name,
round(t2.data_size/1024/1024,4) as data_size_gb,
round(t2.required_size/1024/1024,4) as required_size_gb,t1.svr_ip,t1.TABLE_NAME
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’
and t.tenant_name=‘sys’
group by t1.database_name
order by 4 desc, 3 desc;

可以参考一下这条sql

1 个赞

你好,我的需求是我现在有个租户A ,租户A 下有A1,A1,A3 3个数据库,我想知道A1,A1,A3每个数据库的大小。

报错:
SELECT t.database_name AS db_name, SUM(p.data_size) AS total_data_size FROM oceanbase.CDB_OB_TABLE_LOCATIONS tl JOIN oceanbase.GV$OB_PARTITIONS p ON tl.table_id = p.table_id AND tl.partition_id = p.partition_id JOIN oceanbase.DBA_TABLES t ON tl.table_id = t.table_id WHERE tl.tenant_id = 1002 AND tl.role = ‘LEADER’ GROUP BY t.database_name ORDER BY total_data_size DESC
失败原因:
ErrorCode = 1146, SQLState = 42S02, Details = Table ‘oceanbase.GV$OB_PARTITIONS’ doesn’t exist

根据您提供的错误信息,oceanbase.GV$OB_PARTITIONS 表不存在。这可能是由于视图名称或版本差异导致的问题。在 OceanBase 4.0 中,视图的名称和结构可能会有所不同。

为了准确统计租户 A 下每个数据库(A1、A2、A3)的大小,可以使用 CDB_OB_TABLE_LOCATIONS__all_virtual_table_mgr 视图来计算表占用的磁盘空间,并按数据库进行汇总。以下是修正后的 SQL 查询:

统计租户下每个数据库的大小(Leader)

SELECT 
    a.DATABASE_NAME,
    SUM(
        CASE 
            WHEN b.nested_offset = 0 THEN IFNULL(b.data_block_count + b.index_block_count + b.linked_block_count, 0) * 2 * 1024 * 1024 
            ELSE IFNULL(b.size, 0) 
        END
    ) / 1024.0 / 1024 / 1024 AS data_size_in_GB
FROM 
    oceanbase.CDB_OB_TABLE_LOCATIONS a
JOIN 
    oceanbase.__all_virtual_table_mgr b 
    ON a.svr_ip = b.svr_ip 
    AND a.svr_port = b.svr_port 
    AND a.tenant_id = b.tenant_id 
    AND a.LS_ID = b.LS_ID 
    AND a.TABLET_ID = b.TABLET_ID 
    AND a.role = 'LEADER' 
    AND a.tenant_id = 1002 -- 替换为您的租户ID
    AND b.table_type >= 10 
    AND b.size > 0
GROUP BY 
    a.DATABASE_NAME
ORDER BY 
    data_size_in_GB DESC;

注意事项:

  1. 替换 <your_tenant_id>:请将 1002 替换为您要查询的具体租户 ID。
  2. 数据大小单位:上述查询中的 data_size_in_GB 字段表示的是数据库的数据大小,单位是 GB。如果需要其他单位(例如 MB),可以在查询中调整除数。
  3. 性能影响:在生产环境中执行此类查询时,请注意其对系统性能的影响,尤其是在大体量数据的情况下。建议在低峰时段进行或优化查询以减少资源消耗。

此查询依据的是《OceanBase 数据库》文档中关于 参考指南/系统视图/SYS 租户系统视图/字典视图/oceanbase.CDB_OB_TABLE_LOCATIONS参考指南/系统视图/SYS 租户系统视图/字典视图/oceanbase.__all_virtual_table_mgr 的描述。

如果您有进一步的问题或需要更多帮助,请随时告知!

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

  1. 某租户下所有表占用磁盘大小
  2. 使用命令行进行运维
  3. 查看内存的使用信息
  4. SYS 租户/RS 服务问题
  5. 查看租户和资源信息
  6. oceanbase.CDB_OB_TABLE_LOCATIONS
  7. 常见内存问题

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

1 个赞

select t1.database_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’
and t.tenant_name=‘sys’
group by t1.database_name
order by 3 desc;

使用这条sql

2 个赞

##方法1
sql可以统计当前某个租户的对应的每个数据库大小(leader)
select /*+ LEADING(t t2) */ t1.database_name,t.tenant_name,
round(t2.data_size/1024/1024,4) as data_size_gb,
round(t2.required_size/1024/1024,4) as required_size_gb,t1.svr_ip,t1.TABLE_NAME
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’
and t.tenant_name=‘AA’
group by t1.database_name

用SQL 统计才 2.0000 G
dps core 0.0045 2.0000 G

###查看集群下的A租户的数据库大小 方法2白屏查看 dps 数据库大概 375.23GiB

白屏查看 dps 数据库大概 375.23GiB
dps utf8mb4 utf8mb4_bin

与租户一致 375.23GiB

##方法3
###SQL .SYS租户下 统计 A租户下每个数据库的大小(Leader)
SELECT
a.DATABASE_NAME,
SUM(
CASE
WHEN b.nested_offset = 0 THEN IFNULL(b.data_block_count + b.index_block_count + b.linked_block_count, 0) * 2 * 1024 * 1024
ELSE IFNULL(b.size, 0)
END
) / 1024.0 / 1024 / 1024 AS data_size_in_GB
FROM
oceanbase.CDB_OB_TABLE_LOCATIONS a
JOIN
oceanbase.__all_virtual_table_mgr b
ON a.svr_ip = b.svr_ip
AND a.svr_port = b.svr_port
AND a.tenant_id = b.tenant_id
AND a.LS_ID = b.LS_ID
AND a.TABLET_ID = b.TABLET_ID
AND a.role = ‘LEADER’
AND a.tenant_id = 1080 – 替换为您的租户ID
AND b.table_type >= 10
AND b.size > 0
GROUP BY
a.DATABASE_NAME
ORDER BY
data_size_in_GB DESC;

-》 dps 104.697375942021G

方法1和方法2和方法3的结果差距太大了。请问以哪个为准?

1 个赞

麻烦把方法1和方法3的执行截图发一下看看

哪个才是最终的

我去试一试

result.doc (26.5 KB)

方法1查询的是单副本大小。
方法3查询出来的是表大小不是库大小。
方法2白屏化暂时的是所有zone副本总大小

所以理论上用方法1 查询单副本,和方法3 查询 所有zone副本 (单副本* 副本数量)总大小 既可以?

这个应该是直接搞个内置的功能,或是内置的视图就好了吧

是的