InnoDBはすべてのテーブルを1つの大きなファイルに保存しますibdata1
。
大きなテーブルを削除すると、テーブルのサイズに関係なく、ファイルのサイズが維持されます。データベース全体(合計で数百GB)をダンプして再インポートする必要なしに、そのファイルを縮小するにはどうすればよいですか?
理由は、ドロップをロールバックできるためです。私の場合は必要ありません。
これは、MySQL DBAとして、またDBA StackExchangeで長年にわたって私がこれまでに扱った中で最も物議を醸しているトピックの1つです。
控えめに言っても、ibdata1を縮小する方法は他にありません。 innodb_file_per_table を無効にすると、InnoDBテーブルで OPTIMIZE TABLE
を実行するたびに、 ibdata1は急速に成長します。 DROP TABLE
およびDROP DATABASE
を使用して削除されたデータは、DMLではなくDDLであるため、ロールバックできません。 OracleとMSSQLはDDLをロールバックできると思います。 MySQLはそれを行うことができません。
Ibdata1にはいくつかのクラスの情報があります。
innodb_file_per_table=1
を使用すると、ibdata1の外部で作成されるテーブルデータとテーブルインデックスで新しいテーブルを作成できます。 ALTER TABLE ... ENGINE=InnoDB;
またはOPTIMIZE TABLE
を使用してibdata1内にある任意のテーブルを抽出できますが、ibdata1に大きなギャップの未使用スペースが残ります。
それにもかかわらず、InnoDBインフラストラクチャをクリーンアップする必要があります。これを行う方法と理由について、StackExchangeの投稿を既に書いています。
May 21, 2012
: MySQLデータベースは、ダンプファイルと比較してどのくらいの大きさですか?Apr 01, 2012
: innodb_file_per_tableは推奨ですか?Mar 25, 2012
: なぜInnoDBはすべてのデータベースを1つのファイルに格納するのですか?Feb 04, 2011
: MySQL InnoDB-innodb_file_per_table cons?Oct 29, 2010
: 方法:mysql InnoDBストレージエンジンをクリーンアップしますか?データをダンプし、もう一度リロードするだけで、この問題に再度アクセスする必要はありません。その後OPTIMIZE TABLE
を実行すると、すべてのInnoDBテーブルの.ibd
テーブルスペースファイルが実際に縮小されます。
InnoDBは、my.cnfデフォルトファイルで次の設定を使用しない場合、すべてのInnoDBテーブルをibdata1に格納します。
innodb_file_per_table = 1
DROP TABLE(およびDROP DATABASE)はロールバックできません。
それがibdata1を縮小できない理由ではありません。
これは省略された説明ですが、ibdata1にはテーブルデータに加えてInnoDB内部が含まれています。私の理解では、縮小するには、最適化が必要ですが、これはサポートされている操作ではありません。