AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 14337
Accepted
GoldenNewby
GoldenNewby
Asked: 2012-03-04 17:35:26 +0800 CST2012-03-04 17:35:26 +0800 CST 2012-03-04 17:35:26 +0800 CST

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

  • 772

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

按数据库计算磁盘空间使用量的最快方法是什么?我应该只看文件系统吗?有没有加快信息模式的方法?

mysql
  • 8 8 个回答
  • 121322 Views

8 个回答

  • Voted
  1. Best Answer
    Aaron Brown
    2012-03-05T13:57:16+08:002012-03-05T13:57:16+08:00

    有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)
    

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

    • 64
  2. user9269906
    2019-04-15T01:26:49+08:002019-04-15T01:26:49+08:00

    您可以使用此命令以 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;
    +-------------------------------------+-----------------+
    | 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 为单位的大小。有关更多详细信息,请参阅Aaron Brown 的回答。

    或者要包括免费/可回收空间,请使用:

    mysql> SELECT table_schema "DB name",
    sum( data_length + index_length ) / 1024 / 1024 "DB 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 MB | free/reclaimable space in MB |
    +--------------------+---------------+------------------------------+
    | 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 |
    +--------------------+---------------+------------------------------+
    

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

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

    • 13
  3. Russell Lego
    2018-06-05T14:58:43+08:002018-06-05T14:58:43+08:00

    为了让我查看磁盘空间在哪里被用完(不管它是否在 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 数据的表占用。希望这可以帮助。

    • 3
  4. Mathew
    2015-11-17T04:46:17+08:002015-11-17T04:46:17+08:00

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

    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
  5. Just_Aj
    2019-04-09T21:52:46+08:002019-04-09T21:52:46+08:00

    我知道这很旧,但有人可能会觉得这很相关。

    在 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
    

    希望这可以帮助你

    • 1
  6. Spredzy
    2012-03-05T13:34:49+08:002012-03-05T13:34:49+08:00

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

    警告:根据存储引擎,索引存储在主文件或另一个文件中,如果需要,不要忘记汇总它们。

    • 0
  7. T.Todua
    2019-07-02T10:49:55+08:002019-07-02T10:49:55+08:00

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

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

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

    • 0
  8. faboulaws
    2020-09-27T03:03:59+08:002020-09-27T03:03:59+08:00

    假设您的 MySQL 主机在 Linux 上运行。

    您可以执行下面的查询来找到存储 MySQL 数据的路径

    select @@datadir;
    

    一旦知道数据存储在哪里,就可以使用du命令检查磁盘使用情况。

    例如在 Ubuntu 上sudo du -h /var/lib/mysql。

    你会得到这样的东西

    980K    /var/lib/mysql/db_one
    1.1M    /var/lib/mysql/mysql
    8.0K    /var/lib/mysql/someother_db
    1.2M    /var/lib/mysql/another_db
    212K    /var/lib/mysql/performance_schema
    1.7G    /var/lib/mysql
    

    来源:检查 MySQL 在 linux 上使用的存储

    • 0

相关问题

  • 是否有任何 MySQL 基准测试工具?[关闭]

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

  • 组如何跟踪数据库架构更改?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve