MySQL DBごとのディスクスペース使用量の計算


28

現在、information_schema.TABLESを使用して、データベース名ごとにグループ化された合計ディスク領域使用量を計算していますが、実行速度が非常に遅くなっています。数百のデータベースがあるサーバーでは、計算に数分かかる場合があります。

データベースごとのディスク領域使用量を計算する最も速い方法は何ですか?ファイルシステムを見ているだけですか?information_schemaを高速化する方法はありますか?

回答:


46

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)

非常に多数のテーブルがある場合、すでに発見したように、遅くなる可能性があります。


私は他のどこかで、オプション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)

アーロンブラウンからの回答を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 |
+--------------------+---------------+------------------------------+

InnoDB、MyISAM、およびARCHIVEテーブルのOPTIMIZE TABLEコマンドを使用して、スペースを再利用できます。

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
ええ、でもそれはどこですか?
マグネ14

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データベースのすべての合計サイズを取得します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.