计算每个 MySQL 数据库的磁盘空间使用情况

Gol*_*wby 38 mysql

我目前正在使用 information_schema.TABLES 来计算按数据库名称分组的总磁盘空间使用量,但它运行得非常缓慢。在拥有数百个数据库的服务器上,计算可能需要几分钟时间。

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

Aar*_*own 58

有3种情况。

  1. 如果您使用的是 MyISAM,最简单的方法就是查看文件系统并使用du -sh /var/lib/mysql/database.
  2. 如果您使用带有innodb_file_per_table集的InnoDB ,那么您可以使用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)
Run Code Online (Sandbox Code Playgroud)

如果您有大量的表,它可能会很慢,正如您已经发现的那样。


小智 8

您可以使用此命令获取以 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)
Run Code Online (Sandbox Code Playgroud)

改编了Aaron Brown的答案以提供以 GB 为单位的大小。有关更多详细信息,请参阅Aaron Brown 的回答

或包含免费/可回收空间,请使用:

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 |
+--------------------+---------------+------------------------------+
Run Code Online (Sandbox Code Playgroud)

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

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