TiDB之路2022-03-06
3896

前言

TiDB 如何统计数据库占用空间大小

四种方法

方法一

TiDB 统计数据库占用大小的第一种方法是监控。通过查看 {cluster-name} - Overview
,可以查看Current storage size
面板,获取当前集群已用数据库空间大小。这里显示占用15GB。
使用监控查看数据库大小有一个好处,它可以观测到历史的数据增长趋势。

方法二

第二种方法是根据统计信息来计算大小。使用tables
表中的AVG_ROW_LENGTH
TABLE_ROWS
来进行计算,这个方法的缺点是很依赖于数据库统计信息的准确性。

mysql> select TABLE_SCHEMA,sum(AVG_ROW_LENGTH * TABLE_ROWS)/1024/1024/1024 from information_schema.tables group by TABLE_SCHEMA;
+--------------------+-------------------------------------------------+
| TABLE_SCHEMA       | sum(AVG_ROW_LENGTH * TABLE_ROWS)/1024/1024/1024 |
+--------------------+-------------------------------------------------+
| METRICS_SCHEMA     |                                  0.000000000000 |
| sbtest             |                                  8.280010784045 |
| PERFORMANCE_SCHEMA |                                  0.000000000000 |
| mysql              |                                  0.000000000000 |
| test               |                                  8.530541450717 |
| INFORMATION_SCHEMA |                                  0.000000000000 |
+--------------------+-------------------------------------------------+
6 rows in set (0.01 sec)

如果数据库的统计信息不准,则计算出来的大小就不准,很显然我这里计算是不准的。

方法三

第三种方法使用了tidb-ctl
工具,我们知道Tikv
会把region
信息上报给PD,因此可以使用该工具在 tidb 里面用 table 跟 region 的映射关系估算出 table 的大小。

我们来试一下,随便查询一张表。

tiup ctl:v5.1.3 tidb table disk-usage -d sbtest -t sbtest1
Starting component `ctl`: /root/.tiup/components/ctl/v5.1.3/ctl tidb table disk-usage -d sbtest -t sbtest1
2624

我写了一个shell脚本,遍历了 sbtest 这个schema。

tmp=`mysql -uroot -hxxx -P4000 -Ne "SELECT table_name FROM information_schema.tables where TABLE_SCHEMA='$1'"|while read a ;do echo "$a";done`
sum=0
for i in $tmp
do
tablename=`echo $i |cut -d: -f 1`
tablesize=`tiup ctl:v5.1.3 tidb table disk-usage -d $1 -t $tablename`
sum=$[sum+tablesize]
done
echo $sum

执行结果,显示的是12980,换算出来大概是12.7G。果然和我们从统计信息查出来的差异大。而统计test库显示出大概是1.4G。这样两个库统计出来的数据就是14.1G,接近图1的监控值。

方法四

第四种方法是查看TABLE_STORAGE_STATS
视图。

mysql> select TABLE_SIZE from TABLE_STORAGE_STATS where TABLE_NAME='sbtest1' and table_schema='sbtest';
+------------+
| TABLE_SIZE |
+------------+
|       2624 |
+------------+
1 row in set (0.00 sec)

mysql> select sum(TABLE_SIZE) from TABLE_STORAGE_STATS where table_schema='sbtest';
+-----------------+
| sum(TABLE_SIZE) |
+-----------------+
|           12980 |
+-----------------+
1 row in set (0.02 sec)

这个视图查出来的数据和tidb-ctl
查出来的结果一致。

一个小疑问

这里有个很有意思的地方,之前为了分析客户的高耗SQL问题,在test下面导入了客户的一张表和统计信息(没导入数据)。正好可以用来验证方法二和方法三和四的正确性。

这张pro_ssk
当时只导了表结构和统计信息,没导入任何数据。

mysql> select count(1) from pro_ssk;
+----------+
| count(1) |
+----------+
|        0 |
+----------+
1 row in set (0.01 sec)

mysql> select TABLE_SCHEMA,sum(AVG_ROW_LENGTH * TABLE_ROWS)/1024/1024/1024 from information_schema.tables where table_name='PRO_SSK' group by TABLE_SCHEMA;
+--------------+-------------------------------------------------+
| TABLE_SCHEMA | sum(AVG_ROW_LENGTH * TABLE_ROWS)/1024/1024/1024 |
+--------------+-------------------------------------------------+
| test         |                                  5.842046596110 |
+--------------+-------------------------------------------------+
1 row in set (0.01 sec)

[root@copy-of-vm-ee-centos76-v1 ~]# tiup ctl:v5.1.3 tidb  table disk-usage -d test -t PRO_SSK
Starting component `ctl`: /root/.tiup/components/ctl/v5.1.3/ctl tidb table disk-usage -d test -t PRO_SSK
134

mysql> select TABLE_SIZE from TABLE_STORAGE_STATS where TABLE_NAME='PRO_SSK' and table_schema='test';
+------------+
| TABLE_SIZE |
+------------+
|        134 |
+------------+
1 row in set (0.01 sec)

通过统计信息查询该表占用空间5.84GB。我们用tidb-ctl
TABLE_STORAGE_STATS
视图查看都只有134MB。

疑问来了,为什么空表还占用了134MB ?

我们可以先查出表的region id

mysql> select distinct REGION_ID from TIKV_REGION_STATUS where DB_NAME='test' and TABLE_NAME='PRO_SSK';
+-----------+
| REGION_ID |
+-----------+
|     22001 |
+-----------+
1 row in set (0.01 sec)

然后使用 tikv-ctl
查看这个region的大小。

tiup ctl:v5.1.3 tikv --host 172.16.4.212:20160  size -r 22001

Starting component `ctl`: /root/.tiup/components/ctl/v5.1.3/ctl tikv --host 172.16.4.212:20160 size -r 22001
[2022/03/05 19:46:50.873 +08:00] [INFO] [<unknown>] ["Disabling AF_INET6 sockets because ::1 is not available."]
[2022/03/05 19:46:50.873 +08:00] [INFO] [<unknown>] ["TCP_USER_TIMEOUT is available. TCP_USER_TIMEOUT will be used thereafter"]
[2022/03/05 19:46:50.874 +08:00] [INFO] [<unknown>] ["New connected subchannel at 0x7ffae622e210 for subchannel 0x7ffae9210d80"]
region id: 22001
cf default region size: 0B
cf write region size: 134.060MiB
cf lock region size: 0B

KV 数据最终存储在默认 RocksDB 内部的 default、write、lock 3 个 CF 内。这里可以看到cf write
是134MB的。

根据官网介绍

write
CF 存储的是数据的版本信息 (MVCC) 以及索引相关的数据

但是我这个表真的是空表,也没有做过更新和删除的操作,所以不应该有MVCC和索引的数据。

mysql> select distinct TABLE_NAME from TIKV_REGION_STATUS where REGION_ID =22001;
+-----------------------+
| TABLE_NAME            |
+-----------------------+
| sbtest1               |
| aaa                   |
| a1                    |
| seq2                  |
| sbtest99              |
| PRO_SSK               |
| sbtest5               |
+-----------------------+
7 rows in set (0.01 sec)

再次查询region
的信息,发现这个region
并不是一张表在使用,它还有其他表也在用,所以这130MB有可能是其他数据表的MVCC或者索引信息。所以方法三和方法四这么来看也是不准的。但是相对统计信息来说,还是要准不少的。

后记

以上是TiDB
统计数据库大小的四种方法,看整体大小占用直接看监控就行。如果要看单张表,建议使用tidb-ctl
工具或者是查看TABLE_STORAGE_STATS
视图。

refenerce

https://asktug.com/t/topic/1318

[转帖]TiDB 统计数据库占用大小的N种方法的更多相关文章

  1. 分析redis key大小的几种方法

    当redis被用作缓存时,有时我们希望了解key的大小分布,或者想知道哪些key占的空间比较大.本文提供了几种方法. 一. bigKeys 这是redis-cli自带的一个命令.对整个redis进行扫 ...

  2. Android中动态改变控件的大小的一种方法

    在Android中有时候我们需要动态改变控件的大小.有几种办法可以实现  一是在onMeasure中修改尺寸,二是在onLayout中修改位置和尺寸.这个是可以进行位置修改的,onMeasure不行. ...

  3. 查找linux系统下的端口被占用进程的两种方法 【转】

    在linux下开发时,你的软件可能要使用某一个端口,或者想查找某一个端口是否被占用.需要怎么做呢??这的确是一个比较烦恼的问题,我也此为这个苦恼过.但是通过查找man手册,还是同事的交流.总结出来两种 ...

  4. Linux/Centos查看进程占用内存大小的几种方法总结

    1.命令行输入top回车,然后按下大写M按照memory排序,按下大写P按照CPU排序. 2. ps -ef | grep "进程名"     ps -e -o 'pid,comm ...

  5. Java读取文件夹大小的6种方法及代码

    (一)单线程递归方式 package com.taobao.test; import java.io.File; public class TotalFileSizeSequential { publ ...

  6. VC++实现获取文件占用空间大小的两种方法(非文件大小)

    // GetFileSpaceSize.cpp : Defines the entry point for the console application. // /***************** ...

  7. PHP 获取远程文件的大小的3种方法

    1.使用file_get_contents() <?php $file = file_get_contents($url); echo strlen($file); ?> 2. 使用get ...

  8. pc端字体大小自适应几种方法

    $(window).resize(function ()// 绑定到窗口的这个事件中 {  var whdef = 100/1920;// 表示1920的设计图,使用100PX的默认值  var wH ...

  9. emwin之求解窗口坐标及大小的一种方法

    @2019-01-26 [小记] 使用函数 WM_GetWindowRectEx(hItem, &Rect),坐标就存储在对象 Rect 中,可用于一些默认创建的窗口

  10. 数组比较大小的几种方法及math是方法

    call apply bind 的区别? 解决函数内this的指向: 1.可以在函数外提前声明变量 一般情况下我们用   var _this/that=this 2.通过apply和call来修改函数 ...

随机推荐

  1. Unix IPC

    本文主要是摘抄 APUE 中 IPC 部分的内容 IPC(Inter Process Communication)进程间通信,是指在进程之间进行通信的一种方式,本文将简要介绍一下在 Unix 中存在的 ...

  2. 主控FC1179 U盘量产修复

    当我们的U盘出现如下情况的话,可以做为参考修复 第一步:可以用Chip Genius工具,查看U盘主控(可得知主控厂商:一芯 ,主控型号:FC1179). 第二步:下载主控相对应的量产工具(笔者已经上 ...

  3. 微短剧市场暴涨267.65%,用微短剧场景AUI Kit精巧入局

    微短剧,不仅上头,更要上心. 微短剧,深度"拿捏"了这个碎片化时代,也是刚过去的2023年绕不开的热词. 与传统影视剧制作精益求精.耗时长相反,门槛与耗时"双低" ...

  4. CodeForces 1009E Intercity Travelling 概率DP

    原题链接 题意 给我们一个长为n的序列,要求我们从头开始向右走n个节点,每个位置都有1 / 2的概率将我们传送回1号点之前,不过我们只需要完成走n步的任务就可以了.求我们走过的元素和 乘以 2的n - ...

  5. 仿微信语音聊天webrtc

    主要技术 MediaRecorder 录音 webrtc 获取麦克风 URL.createObjectURL 转换为url(实际生产中,通过后端转换blob为mp3网址) 实现elementui+vu ...

  6. 详解GaussDB(DWS)通信安全的小妙招:连接认证机制

    本文分享自华为云社区<GaussDB(DWS)数据库安全系列之通信安全>,作者:yd_262982826. 1. 前言 适用版本:[8.1.3及以上] 网络是一个开放的环境,仅仅依靠用户名 ...

  7. KubeFlow-Pipeline及Argo实现原理速析

    Argo是一个开源原生容器工作流引擎用于在Kubernetes上开发和运行应用程序.Argo Workflow流程引擎,可以编排容器流程来执行业务逻辑,在20年4月8日进入CNCF孵化器组. 而Kub ...

  8. 抖音上超好听的神曲音乐,Python教你一次性下载

    不知道什么时候开始,中国出现了南抖音.北快手的互文格局(东市买骏马,西市买鞍鞯-).刚才提到了,之前比较喜欢刷抖音,对于我这种佛系程序猿,看网上这些整容妹子基本一个样.喜欢抖音主要是两个初衷,学做菜听 ...

  9. 云图说丨每个成功的业务系统离不开API网关(APIG)的保驾护航

    摘要:华为云API网关(APIG)是为企业开发者及合作伙伴提供的高性能.高可用.高安全的API托管服务, 帮助企业轻松构建.管理和部署不同规模的API. 本文分享自华为云社区<[云图说]第243 ...

  10. C# 完美实现物联网 MQTT 数据通信

    前言 MQTT 协议由于其用极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务,具有开销低.占用带宽低.即时通讯等优点,使其在物联网.小型设备.移动应用等方面有较广泛的应用,在工业物联网中, ...