计算每个MySQL DB的磁盘空间使用量


28

我当前正在使用information_schema.TABLES来计算按数据库名称分组的磁盘总使用量,但是运行速度非常慢。在具有数百个数据库的服务器上,可能要花几分钟才能计算出来。

按数据库计算磁盘空间使用量的最快方法是什么?我应该只看文件系统吗?有没有一种方法可以加快information_schema?

Answers:


46

有3种情况。

  1. 如果您使用的是MyISAM,则最简单的方法就是查看文件系统并使用du -sh /var/lib/mysql/database
  2. 如果您使用的InnoDB 设置了innodb_file_per_table,则可以使用来获得近似答案du -sh。这是近似值,因为ibdata1文件中仍然存储了一些数据,因此您的经验不足。该技术还可以用于混合的MyISAM / InnoDB(innodb_file_per_table)数据库。
  3. 如果您在不使用InnoDB的情况下使用innodb_file_per_table set,那么您将需要查看INFORMATION_SCHEMA。

在上述任何一种情况下,您都可以运行以下查询来获取所需的信息。

mysql> select table_schema, sum((data_length+index_length)/1024/1024) AS MB from information_schema.tables group by 1;
+--------------------+-----------------+
| table_schema       | MB              |
+--------------------+-----------------+
| prod               | 298025.72448921 |
| information_schema |      0.00781248 |
| maatkit            |     70.77330779 |
| mysql              |      0.66873168 |
| test               |   4752.31449127 |
+--------------------+-----------------+
5 rows in set (0.01 sec)

如果您有很多表,那么可能会很慢,就像您已经发现的那样。


我在其他地方看到选项3没有考虑VARCHAR大小。

3

您可以使用以下命令获取以GB为单位的信息:

mysql> select table_schema "DB name (table_schema)", 
sum((data_length+index_length)/1024/1024/1024) AS "DB size in GB" from 
information_schema.tables group by table_schema;
+-------------------------------------+-----------------+
| table_schema DB name (table_schema) | DB size in GB   |
+-------------------------------------+-----------------+
| prod                                |     29.72448921 |
| information_schema                  |      0.00781248 |
| miscDB                              |      0.77330779 |
| mysql                               |      0.66873168 |
| test                                |     47.31449127 |
+-------------------------------------+-----------------+
5 rows in set (0.01 sec)

改写了亚伦·布朗Aaron Brown)的答案以提供GB大小。有关更多详细信息,请参见亚伦·布朗的答案

或包含自由/可回收空间,请使用:

mysql> SELECT table_schema "database name",
sum( data_length + index_length ) / 1024 / 1024 "database size in MB",
sum( data_free )/ 1024 / 1024 "free reclaimable space in MB"
FROM information_schema.TABLES
GROUP BY table_schema; 

+--------------------+---------------+------------------------------+
| DB name            | DB size in GB | free/reclaimable space in GB |
+--------------------+---------------+------------------------------+
| prod               |          1.26 |                         0.03 |
| information_schema |         38.77 |                         3.75 |
| miscDB             |          0.00 |                         0.00 |
| mysql              |          0.00 |                         0.00 |
| test               |          0.00 |                         0.00 |
+--------------------+---------------+------------------------------+

可以使用OPTIMIZE TABLE命令对InnoDB,MyISAM和ARCHIVE表回收空间。

另请参见如何获取MySQL数据库的真实大小? 更多细节。


1

要获取有关表名及其记录数量的信息,可以使用以下查询,

SELECT * 
FROM information_schema.TABLES ;

要获取有关服务器上各自大小的数据库的信息,可以使用以下查询,

SELECT 
TABLE_SCHEMA  AS `Database`,
SUM((data_length + index_length) / (1024 * 1024)) AS `Database_Size`
FROM information_schema.TABLES 
GROUP BY table_schema 
ORDER BY `Database_Size` DESC;

1

为了让我看到磁盘空间被用完了(无论它是否在mysql表中),我使用了可信赖的“ du”命令。这是我发现所有空间被吞噬的示例。

$ sudo du -cks /* | sort -rn
954881224   total
945218092   /mysql
5299904 /usr
1781376 /opt
1166488 /var
671628  /home
343332  /run
213400  /root
93476   /lib
30784   /boot
20652   /etc
15940   /bin
13708   /sbin
12388   /tmp
24  /mnt
16  /lost+found
4   /srv
4   /snap
4   /media
4   /lib64
0   /vmlinuz
0   /sys
0   /proc
0   /initrd.img
0   /dev

您可以看到此文件夹正在使用大部分空间。/ mysql

该文件夹保存数据表。为了查看哪些表占用了所有空间,您可以使用“ human”或“ -h”选项像这样继续进行。我喜欢以这种方式进行磁盘空间管理,因为有时您甚至不知道密码或用户,甚至无法登录mysql。

$ sudo du -chs /mysql/*
2.3M    /mysql/blacklist
18M /mysql/clientservices
2.5G    /mysql/data
4.0K    /mysql/doubleverify
137G    /mysql/ias
4.0K    /mysql/IAS
2.2G    /mysql/innodb
16K /mysql/lost+found
4.0K    /mysql/ml_centroids
16G /mysql/moat
4.0K    /mysql/test
4.0K    /mysql/tmp
4.0K    /mysql/var
282G    /mysql/verticaAdFees
4.0K    /mysql/verticaViewability
247G    /mysql/Whiteops
217G    /mysql/Whiteops_TLX
902G    total

您会看到,所有容纳大量GiG数据的表正在占用所有空间。希望这可以帮助。


0

我会在您的数据字典中查找文件的大小。其瞬时准确。

警告:根据存储引擎,索引存储在主文件中或其他文件中,如果需要,请不要忘记对它们进行汇总。


2
是的,那是哪里?
Magne 2014年

0

我知道这很老了,但有人会发现这很重要。

在MySQL中,我使用:

SELECT concat(table_schema) 'Database Name',
concat(round(SUM(data_length/power(1024,3)),2),'G') DATA,
concat(round(SUM(index_length/power(1024,3)),2),'G') 'INDEX',
concat(round(SUM(data_free/power(1024,3)),2),'G') 'DATA FREE',
concat(round(sum(data_free)/(SUM(data_length+index_length))*100,2)) '% FRAGMENTED',
concat(round(SUM(data_length+index_length)/power(1024,3),2),'G') TOTAL
FROM information_schema.TABLES
WHERE table_schema NOT IN ('mysql','information_schema','performance_schema')
GROUP BY table_schema;

由于我的数据库是InnoDB,所以这只是一个估计。

我将此输出与:

du -sch /location/of_Mysql/* | sort -hr | head -n20

希望这对您有帮助


0

最好(做完后apt-get install ncdu):

cd "/var/lib/mysql" && ncdu

获取您VPS中Mysql数据库的所有总大小。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.