如何获取MySQL数据库的大小?

794

如何获取MySQL数据库的大小?
假设目标数据库名为“v3”。

10个回答

1701

运行此查询,您可能会得到您要查找的内容:

SELECT table_schema "DB Name",
        ROUND(SUM(data_length + index_length) / 1024 / 1024, 1) "DB Size in MB" 
FROM information_schema.tables 
GROUP BY table_schema; 

这个查询来自MySQL论坛,那里提供了更全面的指导。


4
即使我从数据库的表中删除了大部分数据,但大小仍然保持不变。 - Vidz
2
@Vidz 你在使用 InnoDB 引擎吗?如果是的话,除非你使用 file_per_table 和 alter tables,否则你可以释放空间。 - mandza
6
请记住,这种方法不会返回任何完全为空的数据库,至少必须存在一个表才能让该数据库出现在结果中。 - v010dya
17
如果想从单个数据库中选择数据,请在 FROMGROUP 行之间添加以下内容:where table_schema='DATABASE_NAME',将 DATABASE_NAME 替换为你的数据库名称。 - KJ Price
4
注意:MySQL Workbench会报出一个语法错误:“{列标题}(双引号文本)在此不是有效的输入。” 列标题应该用反引号括起来,例如 Database Name - KareemElashmawy
显示剩余5条评论

196

可以使用以下MySQL命令来确定

SELECT table_schema AS "Database", SUM(data_length + index_length) / 1024 / 1024 AS "Size (MB)" FROM information_schema.TABLES GROUP BY table_schema

结果

Database    Size (MB)
db1         11.75678253
db2         9.53125000
test        50.78547382

以 GB 为单位获取结果

SELECT table_schema AS "Database", SUM(data_length + index_length) / 1024 / 1024 / 1024 AS "Size (GB)" FROM information_schema.TABLES GROUP BY table_schema

1
更好的性能:SELECT table_schema AS "数据库", (SUM(data_length)+SUM(index_length)) / 1024 / 1024 / 1024 AS "大小(GB)" FROM information_schema.TABLES GROUP BY table_schema - sonicli

41

或者,如果你使用的是phpMyAdmin,你可以在数据库结构选项卡的页脚中查看表格大小的总和。实际的数据库大小可能略大于此大小,但它似乎与上述table_schema方法一致。

截图:

输入图像描述


30

要得到以MB为单位的结果:

SELECT
SUM(ROUND(((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024), 2)) AS "SIZE IN MB"
FROM INFORMATION_SCHEMA.TABLES
WHERE
TABLE_SCHEMA = "SCHEMA-NAME";

要在GB中得到结果:

SELECT
SUM(ROUND(((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024 / 1024), 2)) AS "SIZE IN GB"
FROM INFORMATION_SCHEMA.TABLES
WHERE
TABLE_SCHEMA = "SCHEMA-NAME";

26

或者您可以直接跳转到数据目录,检查 v3.myd、v3.myi 和 v3.frm 文件的组合大小(对于 MyISAM),或者 v3.idb 和 v3.frm(对于 InnoDB)。


7
注意:仅在使用innodb_file_per_table时才存在ibd文件。 - Slashterix
2
此答案与存储引擎相关,@brian-willis的回答更为适用。 - Manu Manjunath
如果您没有访问权限(使用云服务),例如,您正在使用AWS RDS,则此方法将无法正常工作... - matiaslauriti

23
如果您想要按排序的方式获取所有数据库大小列表,可以使用以下命令:
SELECT * 
FROM   (SELECT table_schema AS `DB Name`, 
           ROUND(SUM(data_length + index_length) / 1024 / 1024, 1) AS `DB Size in MB`
        FROM   information_schema.tables 
        GROUP  BY `DB Name`) AS tmp_table 
ORDER  BY `DB Size in MB` DESC; 

20
mysqldiskusage  --server=root:MyPassword@localhost  pics

+----------+----------------+
| db_name  |         total  |
+----------+----------------+
| pics     | 1,179,131,029  |
+----------+----------------+

如果没有安装,则可以通过安装mysql-utils软件包来进行安装,这个软件包应该被大多数主要的发行版打包。

更新

遗憾的是,他们取消了那个软件包。如果您使用的是Linux(或类似系统),

du -m /var/lib/mysql/*

该命令将列出您拥有的每个数据库的大小,以兆字节为单位。(注意事项:您可能需要root权限才能运行该命令,并且路径可能与我提供的不同。) 这会列出最大的20个:

du -m /var/lib/mysql/* | sort -nb | tail

2
在Debian 10上,这个软件包被称为mysql-utilities - stan
1
注意:mysqldiskusage需要在命令行中使用未加密的密码。使用后一定要从历史记录中删除。 - Poe Dator
@stan mysql-utilities 包在 Debian 11 上已经不存在了。那么我们从哪里获取 mysqldiskusage 命令呢? - baptx
@baptx - 哎呀。所以,我添加了一个替代方案。 - Rick James
@RickJames,我已经在另一个答案中看到了du解决方案,但我想知道是否可以在其他地方获取mysqldiskusage命令。 - baptx
显示剩余2条评论

19

首先使用以下命令登录MySQL:

mysql -u username -p

显示单个数据库及其表的大小(以MB为单位)的命令。

SELECT table_name AS "Table",
ROUND(((data_length + index_length) / 1024 / 1024), 2) AS "Size (MB)"
FROM information_schema.TABLES
WHERE table_schema = "database_name"
ORDER BY (data_length + index_length) DESC;

将database_name更改为您的数据库名称

显示所有数据库及其以MB为单位的大小的命令。

SELECT table_schema AS "Database", 
ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS "Size (MB)" 
FROM information_schema.TABLES 
GROUP BY table_schema;

6

进入mysql数据目录并运行du -h --max-depth=1 | grep 数据库名称


5
好的。但对于像RDS、GCP这样的云数据库服务器,我们无法访问服务器文件系统。 - Akhil
1
文件大小并不能反映真实的数据库大小。 实际上,在从表格中删除条目后,文件不会被缩小;相反,它包含未分配的空间,引擎将在下次使用时重复利用该空间。 - Apuleius
在许多共享主机上,这正是它们用于计算的。 - jor
看起来我们不需要使用 grep,也不需要 --max-depth=1 参数。在我的情况下,使用命令 du -h databasename 的结果是相同的。 - baptx

2

此外:如果有人想要获取单个表的大小,请使用以下代码:

SELECT
  TABLE_NAME AS `Table Name`,
  ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024) AS `Size ( in MB)`
FROM
  information_schema.TABLES
WHERE
    TABLE_SCHEMA = "your_db_name"
  AND
    TABLE_NAME = "your_single_table_name"
ORDER BY
  (DATA_LENGTH + INDEX_LENGTH)
DESC;

注意:使用ROUND()方法时,不会显示小数部分。
希望这能帮助我们中的许多人。

1
嗨,问题是关于如何计算整个数据库的大小,而不是单个表格。请编辑您的答案以达到该结果,或者解释您的答案比已接受的答案更多地做了什么。干杯 - funder7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接