:: DEVELOPER ZONE
重要: 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 とログシーケンス番号をリセットすることが必要になります。
© 1995-2005 MySQL AB. All rights reserved.
