私はデータベース全体のサイズが最大44GBで、うちibdata1は最大35GBです。データのサイズは10GBを超えてはならないため、これは意味がありません。
次のクエリを使用して、データサイズの見積もりを取得します。
SELECT CONCAT(table_schema, '.', table_name),
CONCAT(ROUND(table_rows / 1000000, 2), 'M') rows,
CONCAT(ROUND(data_length / ( 1024 * 1024 * 1024 ), 2), 'G') DATA,
CONCAT(ROUND(index_length / ( 1024 * 1024 * 1024 ), 2), 'G') idx,
CONCAT(ROUND(( data_length + index_length ) / ( 1024 * 1024 * 1024 ), 2), 'G') total_size,
ROUND(index_length / data_length, 2) idxfrac
FROM information_schema.TABLES
ORDER BY data_length + index_length DESC
LIMIT 30;
Ibdata1をクリーンアップする方法と、なぜそれがそれほど大きく成長したのか?
ところで、私はinnodb_file_per_tableを使用しています
アンドレアスは何をすべきかという点で最初にこの答えを得ました 。アンドレアスの+1 !!!
なぜその答えが唯一の方法であり、それを行う方法を明確にしたいと思います。
デフォルトでは、ibdata1は通常4つのタイプの情報を格納します
Ibdata1に保存されたInnoDBテーブルに対してOPTIMIZE TABLEを実行すると、次のようになるため、状況はさらに悪化します。
innodb_file_per_table を使用して、ibdata1からテーブルデータとテーブルインデックスを分離し、それらを個別に管理できます。この方法では、MVCCとテーブルメタデータのみがibdata1に存在します。
すでに使用している場合は、トランザクションの分離をサポートするために大量のMVCCを格納する高書き込み環境が必要です。 MVCCを保持するトランザクションが完了すると、スペースは再利用のために単に破棄されます。
Ibdata1を一度にすべて縮小するには、次のことを行う必要があります。
ステップ01)MySQLDumpですべてのデータベースをSQLテキストファイル(SQLData.sqlと呼びます)
ステップ02)すべてのデータベースを削除する(mysqlスキーマを除く)
ステップ03)service mysql stop
ステップ04)/etc/my.cnfに次の行を追加します
[mysqld]
innodb_file_per_table
innodb_flush_method=O_DIRECT
innodb_log_file_size=1G
innodb_buffer_pool_size=4G
補足:innodb_buffer_pool_sizeの設定が何であれ、innodb_log_file_sizeがinnodb_buffer_pool_sizeの25%であることを確認してください。
ステップ05)rm -f /var/lib/mysql/ibdata1 /var/lib/mysql/ib_logfile
この時点では、/ var/lib/mysqlにmysqlスキーマのみがあるはずです。
ステップ06)service mysql start
これにより、ibdata1が10MBで、ib_logfile0とib_logfile1がそれぞれ1Gで再作成されます。
ステップ07)SQLData.sqlをmysqlに再ロードします
ibdata1は大きくなりますが、テーブルメタデータのみが含まれます
各InnoDBテーブルはibdata1の外部に存在します
Mydb.mytableという名前のInnoDBテーブルがあるとします。/var/lib/mysql/mydbに移動すると、テーブルを表す2つのファイルが表示されます。
ibdata1にInnoDBデータとインデックスが含まれることはなくなります。
/etc/my.cnfのinnodb_file_per_tableオプションを使用すると、OPTIMIZE TABLE mydb.mytable;
とファイル/var/lib/mysql/mydb/mytable.ibdは実際には圧縮されます。
私の推測では、それはある時点でそのように大きくなっています。
ibdata1は縮小しないため、最大サイズを維持します。たぶん、innodb_file_per_tableを実行する前にテーブルがいくつかあった場合は、それがいくつかあります。
圧縮について知っている唯一の方法は、ダンプを実行し、ファイル(ibdata、iblogおよびすべての.idb)を削除して、ダンプをロードすることです。