MySQLDBごとのディスクスペース使用量の計算
On 2月 9, 2021 by admin現在、information_schema.TABLESを使用して、データベース名でグループ化された合計ディスクスペース使用量を計算していますが、実行がひどいです。ゆっくり。数百のデータベースがあるサーバーでは、計算に数分かかる場合があります。
データベースごとのディスク容量使用量を計算する最も簡単な方法は何ですか?ファイルシステムだけを見るべきですか? information_schemaを高速化する方法はありますか?
回答
3つのシナリオがあります。
- MyISAMを使用している場合は、ファイルシステムを確認して
du -sh /var/lib/mysql/database
を使用するのが最も簡単です。 - 使用している場合 innodb_file_per_table が設定されたInnoDBを使用すると、
du -sh
を使用しておおよその答えを得ることができます。 ibdata1ファイルにまだいくつかのデータが保存されているため、概算です。そのため、少しローサイドになります。この手法は、混合MyISAM / InnoDB(innodb_file_per_table
)データベースでも機能します。 -
innodb_file_per_table set
なしでInnoDBを使用している場合、次に、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サイズを考慮していないことをどこかで見ました。
回答
次のコマンドを使用して、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単位で提供しました。詳細については、 AaronBrownの回答を参照してください。
または、空き領域/再生可能領域を含めるには、次を使用します。
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テーブルの OPTIMIZETABLEコマンドを使用してスペースを再利用できます。
詳細については、 MySQLデータベースの実際のサイズを取得する方法も参照してください。
回答
ディスクスペースがどこで使用されているかを確認するために(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のデータを保持するいくつかのテーブルによって、すべてのスペースが占有されていることがわかります。これがお役に立てば幸いです。
回答
テーブルの名前とテーブルのレコード数に関する情報を取得するには、次のクエリを使用できます。
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;
回答
データ辞書でファイルのサイズを探します。その瞬間的で正確です。
警告:ストレージエンジンによると、インデックスはメインファイル内または別のファイルに保存されます。
コメント
- ええ、でもどこにありますか?
回答
これは古いことは知っていますが、誰かがこれに関連していると思うかもしれません。
I n使用する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;
私のDBはInnoDBであるため、これは単なる見積もりです。
この出力を次のように比較します。
du -sch /location/of_Mysql/* | sort -hr | head -n20
これがお役に立てば幸いです
回答
ベスト(apt-get install ncdu
を実行した後):
cd "/var/lib/mysql" && ncdu
VPS内のMysqlデータベースの合計サイズをすべて取得します。
回答
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
コメントを残す