重要: InnoDB-4.1.1 にアップグレードした後に、ダウングレードすることはできません。それは、InnoDB の以前のバージョンが複数のテーブルスペースを認識しないためです。
MySQL-4.1.1 より、各 InnoDB テーブルとそのインデックスを、そのテーブル独自のファイルに格納できるようになりました。各テーブルが独自のテーブルスペースに格納されることから、この機能は複数テーブルスペースと呼ばれます。
この機能を有効にするには、my.cnf
の [mysqld]
セクションに次の行を追加します。
innodb_file_per_table
これによって InnoDB
は、各テーブルが属しているデータベースディレクトリ内にあるテーブル固有の
tablename.ibd
ファイルに、それぞれのテーブルを格納します。これは
MyISAM の動作と似ていますが、MyISAM
ではテーブルがデータファイル
tablename.MYD
とインデックスファイル
tablename.MYI
に分けられます。InnoDB
の場合は、データとインデックスの両方が
.ibd
ファイルに格納されます。
my.cnf
から行
innodb_file_per_table
を削除すると、InnoDB によって再び
ibdata
ファイル内にテーブルが作成されます。4.1.1
以降のバージョンへアップグレードする前に
ibdata
ファイルに格納されていた古いテーブルはそのまま残され、.ibd
ファイルに変換されることはありません。
InnoDB
にはシステムテーブルスペースが必要で、.ibd
ファイルだけでは不十分です。
システムテーブルスペースは、これまで使われていた
ibdata
ファイルで構成されます。InnoDB
は、内部データディクショナリと UNDO
ログをシステムテーブルスペースに配置します。
MyISAM テーブルとは異なり、.ibd ファイルは自由に移動できません。これは、テーブル定義が InnoDB システムテーブルスペースに格納されているためと、InnoDB でトランザクション ID とログシーケンス番号の整合性を維持する必要があるためです。
従来の RENAME
コマンドを使って、.ibd
ファイルと関連テーブルを、あるデータベースから同じ
MySQL/InnoDB
インストール内にある別のデータベースに移すことができます。
RENAME TABLE olddatabasename.tablename TO newdatabasename.tablename;
同じ MySQL/InnoDB インストールから取得した
.ibd
ファイルのクリーンバックアップがある場合は、次のコマンドでそのバックアップを
InnoDB データベースにリストアできます。
ALTER TABLE tablename DISCARD TABLESPACE; /* CAUTION: 現在の .ibd ファイルを削除します! */ <バックアップした .ibd ファイルを適切な場所に置きます> ALTER TABLE tablename IMPORT TABLESPACE;
ここでのクリーンとは、次のことを意味しています。
.ibd
ファイル内に、トランザクションが実行してコミットされていない変更がない。
.ibd
ファイルにマージされていない挿入バッファエントリがない。
削除マークされたすべてのインデックスレコードが
.ibd
ファイルから削除されている。
mysqld
によって、.ibd
ファイルの変更されたすべてのページがバッファプールからファイルにフラッシュされている。
このような .ibd
ファイルのクリーンバックアップは、次の方法で作成できます。
mysqld
サーバのすべての活動を停止し、すべてのトランザクションをコミットする。
SHOW INNODB STATUS
文でデータベースにアクティブなトランザクションがないことが示され、InnoDB
のメインスレッドが Waiting for server
activity
になるのを待つ。これで、.ibd
ファイルのコピーを作成できる。
クリーンな .ibd
ファイルを作成するもう 1
つの方法(有償)があります。
InnoDB ホットバックアップを使用して InnoDB のデータをバックアップする。
新たな mysqld
サーバをバックアップしたファイルを使用するようにして起動し、バックアップ内の
.ibd
ファイルをクリーンアップする。
TODO には、クリーンな .ibd
ファイルも別の MySQL/InnoDB
に移動できるようにすることが挙げられています。そのためには、.ibd
ファイル内でトランザクション ID
とログシーケンス番号をリセットすることが必要になります。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.