file-per-table モードを MySQL サーバーのデフォルトにするには、--innodb_file_per_table
コマンド行オプションでサーバーを起動するか、my.cnf
の [mysqld]
セクションに次の行を追加します。
[mysqld]
innodb_file_per_table
サーバーが動作している間に、コマンドを発行することもできます。
SET GLOBAL innodb_file_per_table=1;
file-per-table モードが有効な場合、InnoDB
は、適切なデータベースディレクトリ内の独自の
ファイルに、新しく作成された各テーブルを格納します。tbl_name
.ibdMyISAM
ストレージエンジンとは異なり、インデックスとデータにそれぞれ
と tbl_name
.MYD
ファイルがあると、tbl_name
.MYIInnoDB
はデータとインデックスを一緒に 1 つの .ibd
ファイルに格納します。それでも、
ファイルは従来どおり作成されます。
tbl_name
.frm
使用する起動オプションから innodb_file_per_table
を削除してサーバーを再起動する場合、または SET GLOBAL
コマンドでオプションをオフにした場合、InnoDB
はシステムのテーブルスペース内に新しいテーブルを作成します。
file-per-table 設定にかかわらず、InnoDB
テーブルの読み取りおよび書き込みは常に実行できます。
テーブルをシステムテーブルスペースから自身のテーブルスペースへ移動するには、またはその反対方向にテーブルを移動するには、innodb_file_per_table
設定を変更してテーブルを再作成します。
-- Move table from system tablespace to its own tablespace.
SET GLOBAL innodb_file_per_table=1;
ALTER TABLE table_name ENGINE=InnoDB;
-- Move table from its own tablespace to system tablespace.
SET GLOBAL innodb_file_per_table=0;
ALTER TABLE table_name ENGINE=InnoDB;
InnoDB
は、内部のデータディクショナリ と Undo ログをシステムのテーブルスペースに配置するため、常にこのテーブルスペースが必要です。.ibd
ファイルは InnoDB
が動作するのには十分ではありません。
システムテーブルスペースから独自の .ibd
ファイルにテーブルが移動された場合、システムテーブルスペースを構成するデータファイルのサイズは維持されます。以前にテーブルが占有したスペースは、新しい InnoDB
データ用に再利用できますが、オペレーティングシステム用には再利用されません。システムテーブルスペースから、ディスクスペースが限られているところへ大規模な InnoDB
テーブルを移動する場合、innodb_file_per_table
をオンにしてから mysqldump コマンドを使用してインスタンス全体を再作成することをお勧めします。