web-dev-qa-db-ja.com

MySql-ibdata1をクリーンアップ

私はデータベース全体のサイズが最大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を使用しています

3
Ran

アンドレアスは何をすべきかという点で最初にこの答えを得ました 。アンドレアスの+1 !!!

なぜその答えが唯一の方法であり、それを行う方法を明確にしたいと思います。

デフォルトでは、ibdata1は通常4つのタイプの情報を格納します

  • テーブルデータ
  • テーブルインデックス
  • MVCC(マルチバージョン同時実行制御)データ
  • テーブルのメタデータ

Ibdata1に保存されたInnoDBテーブルに対してOPTIMIZE TABLEを実行すると、次のようになるため、状況はさらに悪化します。

  • テーブルのデータとインデックスをibdata1内で隣接させる
  • 連続したデータがibdata1に追加されるため、ibdata1が大きくなります

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つのファイルが表示されます。

  • mytable.frm(ストレージエンジンヘッダー)
  • mytable.ibd(mydb.mytableのテーブルデータとテーブルインデックスのホーム)

ibdata1にInnoDBデータとインデックスが含まれることはなくなります。

/etc/my.cnfのinnodb_file_per_tableオプションを使用すると、OPTIMIZE TABLE mydb.mytable;とファイル/var/lib/mysql/mydb/mytable.ibdは実際には圧縮されます。

InnoDBとMyISAMの主な違いは何ですか?

12
RolandoMySQLDBA

私の推測では、それはある時点でそのように大きくなっています。

ibdata1は縮小しないため、最大サイズを維持します。たぶん、innodb_file_per_tableを実行する前にテーブルがいくつかあった場合は、それがいくつかあります。

圧縮について知っている唯一の方法は、ダンプを実行し、ファイル(ibdata、iblogおよびすべての.idb)を削除して、ダンプをロードすることです。

3