web-dev-qa-db-ja.com

MariaDB ALTER TABLEは別の.ibdファイルを生成しましたが、データを共有テーブルスペースに再統合するにはどうすればよいですか?

マルチGBのInnoDBMariaDB(最近MySQLから切り替えられました)があります。何らかの理由で、innodb_file_per_tableの値がONに変更されました(明示的に1つのinnodbデータファイルのみが必要でした)。したがって、大きなテーブルの1つでALTER TABLEステートメントを実行すると、別の.ibdファイルが作成され、共有テーブルスペースで最大100GBのスペースを解放するための対策を講じたにもかかわらず、35GBを占有します(ibdata1)。

このファイルのデータを共有テーブルスペースに再統合するにはどうすればよいですか?おそらくDISCARD TABLESPACEでそれができると思いましたが、これはファイルとその中のデータを削除するだけです(もちろんサンプルテーブルでテストしました)。

3
Stefan Seidel

個別の表領域が必要になる理由はたくさんありますが、特に管理の観点から、単一の共有表領域を持つことのすべての欠点を認識していると思います(たとえば、で一時テーブルを作成するときにファイルシステムスペースを浪費する方法) ALTER)。

MySQL 5.6およびMariaDBの一部のバージョンでは、デフォルトで1に設定されているため、最近アップグレードした場合は、おそらくinnodb_file_per_tableが自動的に変更されます。

メインテーブルスペース内のテーブルを再統合するには、実行中のサーバーで次を実行します。

SET GLOBAL innodb_file_per_table = 0;

次に、次のいずれかを実行してテーブルを再作成します。

ALTER TABLE your_table ENGINE=InnoDB;

または

ALTER TABLE your_table ENGINE=InnoDB, ALGORITHM=COPY;

mariaDB 10/MySQL5.6を使用している場合。

これにより、テーブルがテーブルスペース0に戻ります。再起動後も存続できるように、my.cnfのinnodb-file-per-tableオプションを変更することを忘れないでください。

はい、DISCARD TABLESPACEは他の理由で使用されます。主に、トランスポータブル表領域でデータをインポートします。

3
jynus