TDengine 目前只提供统计超级表占用空间的工具:

  • 2.x 版本使用 select _block_dist() from STABLE_NAME
  • 3.x 版本使用 show table distributed STABLE_NAME

但以上的统计结果并不准确。
如果想统计 DB 使用的空间,只能通过统计所属 vnode 占用空间进行统计。

以下脚本可以实现自动统计所在节点所有数据库的大小。

使用方法:

[root@test ]# mkdir dbsize 
[root@test ]# cd dbsize
[root@test dbsize]# sh dbsize.sh 
db01  0.209675 GB
backtrade  0.282856 GB
db11  0.022892 GB
log  0.163288 GB
audit  0.0711403 GB

注意:

  1. 需要根据实际环境配置用户名和密码
  2. 脚本会生成一系列临时文件,最好放在单独目录内执行
  3. 脚本兼容2.x和3.x版本
  4. 如果只想统计数据文件大小,可以将24行中 xargs du -s 修改为 xargs -I {} du -s {}/tsdb

脚本实现逻辑:

  1. 通过 taos 命令获取数据库列表,将结果存储到 dblist.tmp 文件中
  2. 清理 dblist.tmp 文件中可能存在的Windows 换行符(^M),并将结果排序后保存到 dblist 文件中。
  3. 遍历每个数据库,通过 taos 命令获取该数据库中每个vgroup 的信息,将结果存储到 ${db}.vglist 文件中。
  4. 清理 ${db}.vglist 文件中可能存在的 Windows换行符。
  5. 遍历 ${db}.vglist 文件中的每个 vgroup,通过查找文件夹大小的方式计算每个 vgroup 的大小,并将结果存储到 ${db}.size 文件中。
  6. 输出每个数据库的总大小,即各个 vgroup 的大小之和。

脚本内容如下:

#!/bin/sh
user=root
pass=taosdata

taos -u${user} -p${pass} -s "show databases\G"|grep 'name:' |awk '{print $NF}' |grep -v '_schema'> dblist.tmp
#echo "Get DBlist Done!"
cat -v dblist.tmp | sed 's/\^M//g' |sort -n>dblist
rm -f dblist.tmp
cat dblist |while read db
do
        taos -u${user} -p${pass} -s "show ${db}.vgroups\G"|grep -E 'vgId|vgroup_id'|awk '{print $NF}' >${db}_vg.tmp
        cat -v ${db}_vg.tmp | sed 's/\^M//g' >${db}.vglist
        rm -f ${db}_vg.tmp
        #echo "Get ${db} vglist Done!"
        if [ -s ${db}.vglist ]
        then
                echo > ${db}.size
                cat ${db}.vglist|while read vid
                do
                        for ddir in $(grep -i datadir /etc/taos/taos.cfg|grep -v '#'|awk '{print $2}')
                        do
                                if [ -d ${ddir}/vnode/vnode${vid} ]
                                then
                                vgsize=$(find ${ddir} -type d -name "vnode${vid}" |xargs du -s |awk '{print $1}')
                                echo "${db}.vnode${vid} ${vgsize}" >>${db}.size
                                fi
                        done
                done
                echo "${db}  $(cat ${db}.size|awk '{sum+=$2} END {print sum/1024/1024 " GB"}')"
        fi
done