回答:
これは、MySQL DBAとして、またDBA StackExchangeで長年にわたって扱ってきた最も物議を醸すトピックの1つです。
穏やかにそれを置くためには、単にibdata1とを縮小する方法が他にありません。ではinnodb_file_per_tableを無効にすると、あなたが実行するたびOPTIMIZE TABLE
のInnoDBテーブルの上には、ibdata1とは、急速に成長します。使用して削除されたデータDROP TABLE
とはDROP DATABASE
、彼らは、DML、DDLはないため、ロールバックすることはできません。OracleとMSSQLはDDLをロールバックできると信じています。MySQLはそれができません。
ibdata1にはいくつかのクラスの情報があります
を使用innodb_file_per_table=1
すると、ibdata1の外部で作成されるテーブルデータとテーブルインデックスを使用して新しいテーブルを作成できます。ALTER TABLE ... ENGINE=InnoDB;
またはを使用してibdata1内にあるテーブルを抽出できますがOPTIMIZE TABLE
、その場合、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の短所?Oct 29, 2010
:Howto:mysql InnoDBストレージエンジンをクリーニングしますか?データをダンプし、もう一度リロードするだけで、この問題を再確認する必要はありません。OPTIMIZE TABLE
後で実行すると.ibd
、InnoDBテーブルのテーブルスペースファイルが実際に縮小されます。
my.cnfのデフォルトファイルで次の設定を使用しない場合、InnoDBはすべてのInnoDBテーブルをibdata1にのみ保存します。
innodb_file_per_table = 1
DROP TABLE(およびDROP DATABASE)はロールバックできません。
それが、ibdata1を縮小できない理由ではありません。
これは簡略な説明ですが、ibdata1にはテーブルデータに加えてInnoDB内部が含まれています。私の理解では、縮小するには最適化が必要ですが、これはサポートされている操作ではありません。