首先为大家推荐这个 OceanBase 开源负责人老纪的公众号 “老纪的技术唠嗑局”,会持续更新和 #数据库、#AI#技术架构 相关的各种技术内容。欢迎感兴趣的朋友们关注!

这是一篇纯运维向的文章。

献给所有正在了解 OB,以及准备对 OB 进行测试的朋友们。

背景

准备对 OceanBase 进行测试的朋友们,一定会测一下这款数据库的高压缩比是否如官网上所说的这么恐怖。

目前,在 OceanBase 官网上,虽然已经有 999+ 个与 “磁盘占用空间” 相关的官方文档,但依然无法阻碍用户在 OceanBase 社区论坛中提出 999+ 个与 “磁盘占用空间” 相关的问题。

为了减轻 OceanBase 社区论坛值班同学的工作量,今天简单整理了一篇与 “磁盘占用空间” 相关的文章,在这里和大家分享。欢迎大家在留言区评论、吐槽,以及合理地对作者进行谩骂。

注意:

下文中出现的命令,需要通过 sys 租户,在 oceanbase 库中执行。

文中可能会不厌其烦地备注,希望读者朋友们能够宽恕我的啰嗦。

查询集群和节点的磁盘空间

使用 sys 租户,在 oceanbase 库中,查询各个节点的磁盘占用:

SELECT
SVR_IP,
DATA_DISK_IN_USE / 1024 / 1024 / 1024 AS USED_GB
FROM oceanbase.gv$ob_servers; +--------------+----------------+
| SVR_IP | USED_GB |
+--------------+----------------+
| 12.345.67.89 | 0.300781250000 |
+--------------+----------------+
1 row in set (0.02 sec)

查询租户的的磁盘空间

使用 sys 租户,在 oceanbase 库中,查询指定租户的磁盘占用。需要在 SQL 中填写 tenant_id = xxx:

SELECT svr_ip,
svr_port,
tenant_id,
sum(used_size) / 1024 / 1024 / 1024 AS used_gb
FROM oceanbase.__all_space_usage
WHERE tenant_id = xxx
AND file_type IN ('tenant file data',
'tenant meta data',
'tenant tmp data')
GROUP BY svr_ip,
svr_port; +--------------+----------+-----------+----------------+
| svr_ip | svr_port | tenant_id | used_gb |
+--------------+----------+-----------+----------------+
| 12.345.67.89 | 22602 | 1002 | 0.026878356934 |
+--------------+----------+-----------+----------------+

查询 DataBase 的的磁盘空间

使用 sys 租户,在 oceanbase 库中,查询指定 database 的磁盘占用。需要在 SQL 中填写 tenant_id = xxx。

这里有必要多解释一下下面这条 SQL 中 sum 聚合函数里的 case when:

  • 如果一个 sstable 比较小的话,多个 sstable 会共用一个 2 MB 宏块,计算存储空间的方式会比较特殊。when b.nested_offset = 0 就是用于判断 sstable 是否是小 sstable 的。

    • 如果普通 sstable 的话(b.nested_offset = 0),就使用 2 MB * 宏块数量。
    • 如果是小 sstable 的话(b.nested_offset != 0),就直接用这个 sstable 的 size。

SELECT /*+ query_timeout(30000000) */
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 / 1024 / 1024 AS data_size_in_GB
FROM oceanbase.CDB_OB_TABLE_LOCATIONS a
INNER 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 = xxx
AND b.table_type >= 10
AND b.size > 0
GROUP BY a.DATABASE_NAME; +---------------+-----------------+
| DATABASE_NAME | data_size_in_GB |
+---------------+-----------------+
| oceanbase | 0.003973903134 |
| test | 0.000002717599 |
| __recyclebin | 0.000006728805 |
| mysql | 0.000002369284 |
+---------------+-----------------+
4 rows in set (0.58 sec)

查询表的磁盘空间

以下 4.x 版本,需要使用 sys 租户,在 oceanbase 库中,查询指定 table 的磁盘占用。

  • **4.2.1 BPX < 4.2.1 BP9 **
  • 4.2.2
  • 4.3.x < 4.3.2

需要在 SQL 中填写 tenant_id = xxx,如果不加 database_name = 'xxx' AND table_name = 'xxx' 查询出的结果包含。

SELECT /*+ query_timeout(30000000) */
a.TENANT_ID,
a.DATABASE_NAME,
a.TABLE_NAME,
a.TABLE_ID,
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 / 1024 /1024 AS data_size_in_GB
FROM CDB_OB_TABLE_LOCATIONS a
INNER JOIN __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 = xxx
AND b.table_type >= 10
AND b.size > 0
-- WHERE database_name = 'xxx' AND table_name = 'xxx'
GROUP BY a.TABLE_ID; +-----------+---------------+------------+----------+-----------------+
| TENANT_ID | DATABASE_NAME | TABLE_NAME | TABLE_ID | data_size_in_GB |
+-----------+---------------+------------+----------+-----------------+
| 1002 | test | t1 | 500024 | 0.000000458210 |
+-----------+---------------+------------+----------+-----------------+
1 row in set (0.66 sec)

以下版本,推荐使用下面这种更高性能查询方式。

  • 4.2.1 BPX >= 4.2.1 BP9
  • 4.2.x >= 4.2.3
  • 4.3.x >= 4.3.2

这里也有必要多解释一下下面这条 SQL 中的 occupy_size 和 required_size。

  • occupy_size:可以理解成 data_size,表示压缩后的数据量大小。比如 2 GB 数据压缩成了 1 MB,那么这个数据的 occupy_size 就是 1 MB。
  • required_size:可以理解成 used_size,表示实际给数据分配的空间。比如 2G 数据压缩成了 1 MB,然后占用了一个宏块(一个宏块的默认大小 2 MB),那么这个数据的 required_size = 2 MB。
-- 查普通用户表(非系统表)
SELECT atnt.tenant_id AS TENANT_ID,
avttl.table_id AS TABLE_ID,
atnt.tenant_name AS TENANT_NAME,
ad.database_name AS DATABASE_NAME,
avt.table_name AS TABLE_NAME,
sum(avtps.occupy_size) / 1024 / 1024 /1024 AS OCCUPY_SIZE_IN_GB,
sum(avtps.required_size) / 1024 / 1024 /1024 AS REQUIRED_SIZE_IN_GB
FROM oceanbase.__all_virtual_tablet_pointer_status avtps
INNER JOIN oceanbase.__all_virtual_tablet_to_ls avttl
ON avttl.tenant_id = avtps.tenant_id
AND avttl.tablet_id = avtps.tablet_id
INNER JOIN oceanbase.__all_tenant atnt
ON atnt.tenant_id = avttl.tenant_id
INNER JOIN oceanbase.__all_virtual_table avt
ON avt.tenant_id = avttl.tenant_id
AND avt.table_id = avttl.table_id
INNER JOIN oceanbase.__all_virtual_database ad
ON ad.tenant_id = atnt.tenant_id
AND ad.database_id = avt.database_id
INNER JOIN oceanbase.__all_virtual_ls_meta_table avlmt
ON avtps.tenant_id = avlmt.tenant_id
AND avtps.ls_id = avlmt.ls_id
AND avtps.svr_ip = avlmt.svr_ip
AND avtps.svr_port = avlmt.svr_port
AND avlmt.role = 1
WHERE atnt.tenant_id = 1002 AND database_name = 'test' AND table_name = 't2'
GROUP BY tenant_id,
table_id
ORDER BY tenant_id,
table_id
\G
*************************** 1. row ***************************
TENANT_ID: 1002
TABLE_ID: 500024
TENANT_NAME: mysql
DATABASE_NAME: test
TABLE_NAME: t1
OCCUPY_SIZE_IN_GB: 0.000000458210 -- 数据压缩后的真实大小
REQUIRED_SIZE_IN_GB: 0.000003814697 -- 4 MB,实际占用了两个宏块
1 row in set (0.32 sec)

What's more ?

从 4.3.4 版本开始,开始支持使用标准 CDB 视图查询空间占用。还是需要使用 sys 租户,在 oceanbase 库中查询。

create table t1 (a int) ;
Query OK, 0 rows affected (0.278 sec) select * from CDB_OB_TABLE_SPACE_USAGE\G
*************************** 1. row ***************************
TENANT_ID: 1002
TABLE_ID: 500024
TENANT_NAME: mysql
DATABASE_NAME: test
TABLE_NAME: t1
OCCUPY_SIZE: 492
REQUIRED_SIZE: 4096
1 row in set (0.52 sec)

select * from CDB_OB_SERVER_SPACE_USAGE\G
*************************** 1. row ***************************
TENANT_ID: 1
TENANT_NAME: sys
SERVER_IP: 11.158.31.20
SERVER_PORT: 22602
SPACE_TYPE: Clog Data
DATA_BYTES: 1677562658
USAGE_BYTES: 1677562658
*************************** 2. row ***************************
TENANT_ID: 1
TENANT_NAME: sys
SERVER_IP: 11.158.31.20
SERVER_PORT: 22602
SPACE_TYPE: Index Data
DATA_BYTES: 1801
USAGE_BYTES: 16384
*************************** 3. row ***************************
TENANT_ID: 1
TENANT_NAME: sys
SERVER_IP: 11.158.31.20
SERVER_PORT: 22602
SPACE_TYPE: Meta Data
DATA_BYTES: 17129472
USAGE_BYTES: 17129472
*************************** 4. row ***************************
TENANT_ID: 1
TENANT_NAME: sys
SERVER_IP: 11.158.31.20
SERVER_PORT: 22602
SPACE_TYPE: Slog Data
DATA_BYTES: 16629760
USAGE_BYTES: 16629760
*************************** 5. row ***************************
TENANT_ID: 1
TENANT_NAME: sys
SERVER_IP: 11.158.31.20
SERVER_PORT: 22602
SPACE_TYPE: Table Data
DATA_BYTES: 2012
USAGE_BYTES: 16384
*************************** 6. row ***************************
TENANT_ID: 1
TENANT_NAME: sys
SERVER_IP: 11.158.31.20
SERVER_PORT: 22602
SPACE_TYPE: Tmp Data
DATA_BYTES: 0
USAGE_BYTES: 0

obclient> select * from CDB_OB_SPACE_USAGE\G
*************************** 1. row ***************************
TENANT_ID: 1
TENANT_NAME: sys
ENDPOINT: NULL
PATH: NULL
SPACE_TYPE: Clog Data
USAGE_BYTES: 1677328015
*************************** 2. row ***************************
TENANT_ID: 1
TENANT_NAME: sys
ENDPOINT: NULL
PATH: NULL
SPACE_TYPE: Local Data
USAGE_BYTES: 67760128

附录

最后附上本文中出现的一些系统表的简单介绍:

  • __all_virtual_table_mgr

    • 用于通过 size 字段,查询所有 sstable、memtable 的 occupy_size。
    • 表名中带 virtual 字样的都是虚拟表,查询时实时构建。查这张表是准的,但可能比较慢。
  • __all_virtual_tablet_meta_table
    • 查询到的 occupy_size,required_size 是基线 sstable 的大小。
    • 只展示基线、多版本基线的大小(没有转储 sstable 的数据,和其他表的数据量对不上是符合预期的)。
  • __all_virtual_tablet_pointer_status
    • 查询所有 tablet 相关的信息

      • occupy_size:tablet 的 occupy_size
      • required_size:tablet 的 required_size
  • __all_space_usage
    • 实体表,定时任务,定时更新。
    • 展示每个 server 上的每个租户不同类型的空间占用信息。
    • tenant file data : 租户下所有 tablet 的 occupy_size 总和。

老纪的技术唠嗑局 不仅希望能持续给大家带来有价值的技术分享,也希望能和大家一起为开源社区贡献力量。如果你对 OceanBase 开源社区认可,点亮一颗小星星 吧!你的每一个Star,都是我们努力的动力~

https://github.com/oceanbase/oceanbase

DBA 必知必会 —— OB 4.x 版本如何查询磁盘空间占用情况?的更多相关文章

  1. 读书笔记汇总 - SQL必知必会(第4版)

    本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...

  2. 读书笔记--SQL必知必会--建立练习环境

    书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL in 10 Minutes - Fourth Edition> MyS ...

  3. 读书笔记--SQL必知必会12--联结表

    12.1 联结 联结(join),利用SQL的SELECT在数据查询的执行中联结表. 12.1.1 关系表 关系数据库中,关系表的设计是把信息分解成多个表,一类数据一个表,各表通过某些共同的值互相关联 ...

  4. 读书笔记--SQL必知必会18--视图

    读书笔记--SQL必知必会18--视图 18.1 视图 视图是虚拟的表,只包含使用时动态检索数据的查询. 也就是说作为视图,它不包含任何列和数据,包含的是一个查询. 18.1.1 为什么使用视图 重用 ...

  5. 《MySQL 必知必会》读书总结

    这是 <MySQL 必知必会> 的读书总结.也是自己整理的常用操作的参考手册. 使用 MySQL 连接到 MySQL shell>mysql -u root -p Enter pas ...

  6. 《SQL必知必会》学习笔记(一)

    这两天看了<SQL必知必会>第四版这本书,并照着书上做了不少实验,也对以前的概念有得新的认识,也发现以前自己有得地方理解错了.我采用的数据库是SQL Server2012.数据库中有一张比 ...

  7. SQL 必知必会

    本文介绍基本的 SQL 语句,包括查询.过滤.排序.分组.联结.视图.插入数据.创建操纵表等.入门系列,不足颇多,望诸君指点. 注意本文某些例子只能在特定的DBMS中实现(有的已标明,有的未标明),不 ...

  8. .NET程序员项目开发必知必会—Dev环境中的集成测试用例执行时上下文环境检查(实战)

    Microsoft.NET 解决方案,项目开发必知必会. 从这篇文章开始我将分享一系列我认为在实际工作中很有必要的一些.NET项目开发的核心技术点,所以我称为必知必会.尽管这一系列是使用.NET/C# ...

  9. 0005 《SQL必知必会》笔记01-SELECT语句

    1.SELECT基本语句: SELECT 字段名1,···,字段名n FROM 表名 2.检索所有字段,用"*"替换字段名,这会导致效率低下 SELECT * FROM 表名; 3 ...

  10. 2015 前端[JS]工程师必知必会

    2015 前端[JS]工程师必知必会 本文摘自:http://zhuanlan.zhihu.com/FrontendMagazine/20002850 ,因为好东东西暂时没看懂,所以暂时保留下来,供以 ...

随机推荐

  1. Ansible创建逻辑卷

    环境: 受控主机清单文件: [dev] 192.168.10.129 [all:vars] ansible_ssh_user=root ansible_ssh_pass=123 磁盘: 受控主机需要存 ...

  2. JDK 24 发布,新特性解读!

    真快啊!Java 24 这两天已经正式发布啦!这是自 Java 21 以来的第三个非长期支持版本,和 Java 22.Java 23一样. 下一个长期支持版是 Java 25,预计今年 9 月份发布. ...

  3. C++判断文本编码

    #include <iostream> #include <fstream> #include <string> #include <sstream> ...

  4. pagehelper的失效问题

    pagehelper是常用的分页插件,代码中常用到,使用简便且对代码侵入性较小,很多人都喜欢使用.不过有时会遇到分页失败问题,输出结果没有分页,日志输出sql语句没有分页关键字及分页参数,目测是pag ...

  5. HBase集群快速部署摘要

    HBase快速部署摘要 相关软件版本 系统:CentOS-7-1810 JDK:7u79 Hadoop:2.7.2 ZooKeeper:3.4.10 HBase:1.3.3 静态IP 位置 vi /e ...

  6. Oracle PLSQL 存储过程无法进入单步调试

    使用PLSQL工具调试存储过程的时候,不管你怎么设置断点,当你点击测试的时候就瞬间执行而过你无法进入单步调试 解决办法:

  7. tomghost打靶学习笔记(3)

    主要内容 信息收集:ajp漏洞 横向提权:在没有办法立刻提升到管理员权限时,可以试试通过横向的权限提升切换到其他用户再做提权尝试 涉及尝试了前两台靶机没有用过的枚举方法,比如SUID 使用john解码 ...

  8. 2025dsfzB层考试总结

    2025年东师附中B层春季测试1考试总结 Designed By Lwj54joy AT 2025-03-01 本文将遵守GNU GPL2.0开源协议. 概述 总分:\(310/400\) 改题分数: ...

  9. 安装MVN出现 Error: JAVA_HOME is set to an invalid directory.的解决方法

    出现 Error: JAVA_HOME is set to an invalid directory.的解决方法 解决: 将JAVA_HOME = "D:/Java/jdk1.6.0_12/ ...

  10. Windows 实用工具(新机、全新系统、重装系统必备)

    Windows 实用工具 https://www.lanzoub.com/b0ziu7owh 密码:akoc HEU_KMS_Activator Windows 激活工具. 下载链接: Github: ...