1. 背景
TDengine 之前版本一直没有通过 SQL 命令查看数据库占用的磁盘空间大小,从 3.3.5.0 开始,增加了这个方便且实用的小功能,这里详细介绍下。
2. SQL 基本语法
select expr from information_schema.ins_disk_usage [where condtion]
行为说明: 查看各个vgroup 的各个组件磁盘占用情况,并且可以通过查询语句计算压缩率等。
示例:
taos> select * from ins_disk_usage where db_name = "test";
db_name|vgroup_id|wal|data1|data2|data3|cache_rdb|table_meta|
s3|raw_data|
=========================================================
test|13 | 112 | 256 | 2000| 3000| 4000| 8000| 9000| 10000
Query OK, 1 row(s) in set (0.003510s)
3. 快捷命令
快捷命令是比较短的可快速查看信息的命令,查看磁盘空间的命令是:
show disk_info;
示例:
taos> show disk_info;
_db_usage |
=================================
Compress_radio: 23% |
Disk_occupied: 400M |
Query OK, 2 row(s) in set (0.013209s)
行为说明:
- compression_ratio: 类型为double 类型,代表当前库的压缩率, 如果估算出来 raw_data 的size 小于1k, 则显示为NULL。
- disk_occupied: 类型为整数类型,代表当前用户数据占用大小。
命令等同于:
select
sum(data1 + data2 + data3)/sum(raw_data),
sum(data1 + data2 + data3)
from information_schema.ins_disk_usage
where db_name="dbname"
4. 新增系统表
本功能需新增系统表,在 information_schema 中新增 ins_disk_usage 表,各字段含义如下:
字段 | 含义 | 类型 | 单位 | 备注 |
db_name | Db 的名称 | Varchar | 无 | 准确值 |
vgroup_id | Vgroup 的ID号 | 整数类型 | 无 | 准确值 |
wal | wal 的大小 | 长整数类型 | K | 准确值 |
data1 | 一级存储上磁盘占用大小 | 长整数类型 | K | 同上, 不包含WAL 值 |
data2 | 二级存储上磁盘占用大小 | 长整数类型 | K | 准确值,不包含WAL值 |
data3 | 三级存储上磁盘占用大小 | 长整数类型 | K | 准确值, |
cache_rdb | last/last_row占用磁盘的大小 | 长整数类型 | K | 同上 |
table_meta | Table Meta 占用磁盘大小 | 长整数类型 | K | 同上 |
s3 | s3 上占用的数据的大小 | 长整数类型 | K | 相对准确值 |
raw_data | 预估出来的真实数据的大小,不含mem table | 长整数类型 | k | 估算值 |
5. 性能
命令资源消耗大:
需要到各 vnode 获取其基本磁盘占用、表数量、行数,行数统计等信息,需要读 header block 信息 IO 使用多。
执行时间:
预估为秒级,性能和 show table distributed stableName
类似, 如果 DB 上超级表或者普通表的数目为 N, 执行单个 show table distributed table
时间为 T,那么执行该查询的时间则为 N * T。
6. 约束和限制
约束: 本质上是一个运维工具, 且资源消耗比较大,不建议频繁调用,
限制:
-
如果有大量的删表、删数据行为,不能准确计算得到压缩率等信息,需要等到完全compact 完全结束之后,才能得到一个相对准确的压缩率,如果在compact 还没有结束时,查询得到的磁盘占用可能过大。
-
本实现统计是按实际文件占用进行统计且忽略了目录本身的大小, 因此和用 `du ` 命令直接统计目录的大小存在一定的区别,两者差距一般小于1M。
-
多副本情况下,只统计单副本的DB的占用大小
-
如果要统计单个DB 实际的磁盘占用可以用
select sum(data1+data2+data3+wal+cache_rdb + table_meta) from ins_disk_usage where dbname = "test"
-
文件大小的磁盘占用大小