web-dev-qa-db-ja.com

すべてのデータベースをダンプせずにinnodbファイルibdata1を縮小するにはどうすればよいですか?

InnoDBはすべてのテーブルを1つの大きなファイルに保存しますibdata1

大きなテーブルを削除すると、テーブルのサイズに関係なく、ファイルのサイズが維持されます。データベース全体(合計で数百GB)をダンプして再インポートする必要なしに、そのファイルを縮小するにはどうすればよいですか?

理由は、ドロップをロールバックできるためです。私の場合は必要ありません。

24
rubo77

これは、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にはいくつかのクラスの情報があります。

  • テーブルデータ
  • テーブルインデックス
  • テーブルのメタデータ
  • MVCC制御データ
  • 二重書き込みバッファー(OSキャッシュへの依存を防ぐためのバックグラウンド書き込み)
  • バッファーの挿入(一意でないセカンダリインデックスへの変更の管理)

innodb_file_per_table=1を使用すると、ibdata1の外部で作成されるテーブルデータとテーブルインデックスで新しいテーブルを作成できます。 ALTER TABLE ... ENGINE=InnoDB;またはOPTIMIZE TABLEを使用してibdata1内にある任意のテーブルを抽出できますが、ibdata1に大きなギャップの未使用スペースが残ります。

それにもかかわらず、InnoDBインフラストラクチャをクリーンアップする必要があります。これを行う方法と理由について、StackExchangeの投稿を既に書いています。

良いニュース

データをダンプし、もう一度リロードするだけで、この問題に再度アクセスする必要はありません。その後OPTIMIZE TABLEを実行すると、すべてのInnoDBテーブルの.ibdテーブルスペースファイルが実際に縮小されます。

30
RolandoMySQLDBA

InnoDBは、my.cnfデフォルトファイルで次の設定を使用しない場合、すべてのInnoDBテーブルをibdata1に格納します。

innodb_file_per_table = 1

DROP TABLE(およびDROP DATABASE)はロールバックできません。

それがibdata1を縮小できない理由ではありません。

これは省略された説明ですが、ibdata1にはテーブルデータに加えてInnoDB内部が含まれています。私の理解では、縮小するには、最適化が必要ですが、これはサポートされている操作ではありません。

2