MySQL 数据库表空间大小监控

一、查询数据库占用空间大小

如果想知道MySQL数据库中每个表占用的空间、表记录的行数的话,可以打开MySQLinformation_schema 数据库。在该库中有一个 TABLES 表,这个表主要字段分别是:

TABLE_SCHEMA : 数据库名

TABLE_NAME:表名

ENGINE:所使用的存储引擎

TABLES_ROWS:记录数

DATA_LENGTH:数据大小

INDEX_LENGTH:索引大小

所以要知道一个表占用空间的大小,那就相当于是 数据大小 + 索引大小 即可。

进入 information_schema 这个数据库,执行如下sql 语句 :

1.1 查看数据库占用空间大小

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- 数据长度
SELECT concat(round(sum(DATA_LENGTH/1024/1024/1024),2),'GB') as data_size FROM information_schema.TABLES where TABLE_SCHEMA='cgjr';

-- 索引长度
SELECT concat(round(sum(INDEX_LENGTH/1024/1024/1024),2),'GB') as len_size FROM information_schema.TABLES where TABLE_SCHEMA='cgjr';

-- 总空间大小(数据大小 + 索引大小)
SELECT concat(round((sum(DATA_LENGTH)+sum(INDEX_LENGTH))/1024/1024/1024,2),'G') as total_size FROM information_schema.TABLES where TABLE_SCHEMA='cgjr';


-- 查看top10所有表的大小
SELECT TABLE_SCHEMA,TABLE_NAME,round((sum(DATA_LENGTH)+sum(INDEX_LENGTH))/1024/1024/1024,2) as size_G,TABLE_ROWS FROM TABLES
GROUP BY TABLE_NAME
ORDER BY round((sum(DATA_LENGTH)+sum(INDEX_LENGTH))/1024/1024/1024,2) desc LIMIT 10
1
2
3
4
5
6
7
-- 查询所有数据库占用磁盘空间大小的SQL语句:
select TABLE_SCHEMA, concat(truncate(sum(data_length)/1024/1024/1024,2),' GB') as data_size,
concat(truncate(sum(index_length)/1024/1024/1024,2),'GB') as index_size,
concat(truncate(sum(data_length)/1024/1024/1024,2)+truncate(sum(index_length)/1024/1024/1024,2),'GB') as total_size
from information_schema.tables
group by TABLE_SCHEMA
order by truncate(sum(data_length)/1024/1024/1024,2)+truncate(sum(index_length)/1024/1024/1024,2) desc;

数据库中有几十上百张表,那么哪些表的数据量比较大呢,如何查询mysql数据库中哪些表的数据量最大

1
2
3
4
5
6
7
-- 查询单个库中所有表磁盘占用大小的SQL语句:
select TABLE_NAME, concat(truncate(data_length/1024/1024/1024,2),' GB') as data_size,
concat(truncate(index_length/1024/1024/1024,2),' GB') as index_size,
concat(truncate(data_length/1024/1024/1024,2)+truncate(index_length/1024/1024/1024,2),'GB') as total_size
from information_schema.tables where TABLE_SCHEMA = 'cgjr'
group by TABLE_NAME
order by truncate(data_length/1024/1024/1024,2)+truncate(index_length/1024/1024/1024,2) desc LIMIT 10;
1
2
3
4
5
6
-- 查询数据库缓存占用大小的sql语句:
select TABLE_NAME, concat(truncate(data_length/1024/1024/1024,2),' GB') as data_size,
concat(truncate(data_free/1024/1024/1024,2),'GB') as free_size
from information_schema.tables where TABLE_SCHEMA = 'cgjr'
group by TABLE_NAME
order by concat(truncate(data_free/1024/1024/1024,2),'GB') desc LIMIT 10;

1.2 释放数据库表

1
2
-- 释放数据库表 缓存占用大小的sql语句:
optimize table t_resource_file;

结合mysql官方网站的信息,个人是这样理解的。当你删除数据时,mysql并不会回收,被已删除数据的占据的存储空间,以及索引位。而是空在那里,而是等待新的数据来弥补这个空缺,这样就有一个缺少,如果一时半会,没有数据来填补这个空缺,那这样就太浪费资源了。所以对于写比较频烦的表,要定期进行optimize,一个月一次,看实际情况而定了。

二、监控数据库占用空间

监控的方式有很多,比如:

  • 使用 grafana 监控并展示数据
  • 使用 prometheus 或其它监控平台

2.1 使用 grafana 监控

grafana 的部署这里就不介绍了,都很简单可以参考其它的部署文章

2.1.1 添加 MySQL 数据源

图片1

最好单独添加一个用于监控的 mysql 账号,只有只读权限;可以参考我另一遍 Prometheus监控MySQL 进行配置

2.1.2 配置监控面板

图片2

查询sql

1
2
3
4
5
6
7
8
SELECT
TABLE_SCHEMA as 库名,
TABLE_NAME as 表名,
concat(round((sum(DATA_LENGTH)+sum(INDEX_LENGTH))/1024/1024,2)) as 占用空间,
TABLE_ROWS as 数据量
FROM TABLES
where TABLE_SCHEMA not in ('sys','mysql','information_schema')
group by TABLE_SCHEMA,TABLE_NAME

图片3

配置好后大概就是这样

图片5

2.2 使用 prometheus 监控

使用 prometheus 监控需要自己写脚本去定期查询 information_schema 库,然后把各表的占用空间和数据量 post 到 pushgateway 中,然后通过prometheus拉取监控数据再通过grafana进行展示或直接配置告警策略。

后续使用 prometheus 监控数据库空间大小再更新……

-------------本文结束感谢您的阅读-------------