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


24

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

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

理由は、ドロップをまだロールバックできるからだと思います。私の場合、必要はありません。

回答:


30

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

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

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

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

良いニュース

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


1
軽微な修正:MSSQLおよびPostgreSQLはDDLをロールバックできます。Oracleはできません。実際、OracleはDDLを検出すると暗黙のコミットを発行します!
クリス・トラヴァース

1
@RolandoMySQLDBAは、MySQLのどのバージョンから、この自動縮小の「良いニュース」が機能するのですか?
ガブリエル

@Gavriel-誤解していると思います。まだダンプする必要があります。ibdata1を削除します。再起動; そしてリロード。ibdata1の自動収縮なし。(iblog *の変更がより簡単になりました。)
リックジェームズ

2

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

innodb_file_per_table = 1

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.