このセクションでは、Transportable Tablespace 機能を使用して、file-per-table テーブルスペース (.idb
ファイル) をあるデータベースサーバーから別のデータベースサーバーにコピーする方法について説明します。
他の InnoDB
テーブルコピー方式について詳しくは、セクション14.6.2「別のマシンへの InnoDB テーブルの移動またはコピー」を参照してください。
InnoDB
file-per-table テーブルスペースを別のデータベースサーバーにコピーすることをお勧めするのには、多くの理由があります。
本番サーバーに余計な負荷を掛けずにレポートを実行するため。
新しいスレーブサーバーに、あるテーブルとまったく同じデータをセットアップするため。
問題や誤りが発生したあとに、テーブルのバックアップ版をリストアするため。
mysqldump コマンドの結果をインポートするよりも、データを移動させる方が速いため。データの再挿入とインデックスの再構築を行うよりも、データがすぐに使用できるためです。
システム要件により適したストレージ媒体を持つサーバーに file-per-table テーブルスペースを移動するため。たとえば、アクセス頻度の高いテーブルを SSD デバイスに置いたり、大規模なテーブルを大容量の HDD デバイスに置いたりする場合です。
テーブルスペースのコピーの制限と使用方法に関する注意 (トランスポータブルテーブルスペース)
テーブルスペースのコピー手順は、
innodb_file_per_table
がON
(MySQL 5.6.6 以降ではデフォルトです) に設定されている場合にのみ可能です。共有のシステムテーブルスペースにあるテーブルは休止できません。テーブルが休止されると、影響を受けたテーブルでは読み取り専用のトランザクションのみが許可されます。
テーブルスペースをインポートする場合、ページサイズはインポートするインスタンスのページサイズに一致する必要があります。
DISCARD TABLESPACE
がパーティション化されたテーブルでサポートされていないということは、トランスポータブルテーブルスペースも未サポートであることを意味します。パーティション化されたテーブルでALTER TABLE ... DISCARD TABLESPACE
を実行すると、次のエラーが返されます。ERROR 1031 (HY000): Table storage engine for 'part' doesn't have this option.DISCARD TABLESPACE
は、foreign_key_checks
が1
に設定されている親/子 (主キー/外部キー) 関係を持つテーブルスペースをサポートしていません。親子関係のテーブルのテーブルスペースを破棄する前に、foreign_key_checks=0
を設定します。ALTER TABLE ... IMPORT TABLESPACE
は、インポートされたデータに対して外部キー制約を課しません。テーブル間に外部キー制約がある場合、すべてのテーブルを同じ (論理上の) 時点でエクスポートしてください。-
ALTER TABLE ... IMPORT TABLESPACE
では、テーブルスペースをインポートするための.cfg
メタデータファイルは必要ありません。ただし、.cfg
ファイルなしでインポートした場合は、メタデータのチェックは実行されず、次に類似した警告が発行されます。Message: InnoDB: IO Read error: (2, No such file or directory) Error opening '.\ test\t.cfg', will attempt to import without schema verification 1 row in set (0.00 sec)
.cfg
ファイルなしでインポートする機能は、スキーマの不一致が予想されない場合に、使い勝手が高まる可能性があります。また、.cfg
ファイルなしでインポートする機能は、メタデータが.ibd
ファイルから収集できないクラッシュリカバリシナリオで役立つ可能性があります。 MySQL 5.6 以降では、両方のサーバーが GA (一般提供) ステータスであり、両者のバージョンが同じシリーズである場合に、テーブルスペースファイルの別のサーバーからのインポートが機能します。そうでないと、インポート先のサーバーにファイルが作成されていなければなりません。
レプリケーションシナリオでは、マスターとスレーブの両方で
innodb_file_per_table
がON
に設定されている必要があります。-
Windows では、
InnoDB
はデータベース、テーブルスペース、およびテーブル名を内部的に小文字で格納します。Linux や UNIX など、大文字と小文字を区別するオペレーティングシステムでインポートの問題を回避するには、すべてのデータベース、テーブルスペース、およびテーブルを小文字名を使用して作成します。これを遂行する便利な方法は、データベース、テーブルスペース、またはテーブルを作成する前に、my.cnf
またはmy.ini
ファイルの[mysqld]
セクションに次の行を追加することです。[mysqld] lower_case_table_names=1
手順の例: あるサーバーから別のサーバーへのテーブルスペースのコピー (トランスポータブルテーブルスペース)
この手順では、MySQL の実行中のサーバーインスタンスから実行中の別のインスタンスへテーブルをコピーする方法について説明します。同じ手順は、微調整を加えると、同じインスタンスでテーブルの完全なリストアを実行するために使用できます。
-
ソースサーバーで、テーブルがまだ存在していない場合、テーブルを作成します。
mysql> use test; mysql> CREATE TABLE t(c1 INT) engine=InnoDB;
-
目的サーバーで、テーブルが存在していない場合、テーブルを作成します。
mysql> use test; mysql> CREATE TABLE t(c1 INT) engine=InnoDB;
-
目的サーバーで、既存のテーブルスペースを破棄します。(テーブルスペースをインポートする前に、
InnoDB
は受け取り側のテーブルにアタッチされたテーブルスペースを破棄します。)mysql> ALTER TABLE t DISCARD TABLESPACE;
-
ソースサーバーでは、
FLUSH TABLES ... FOR EXPORT
を実行してテーブルを休止し、.cfg
メタデータファイルを作成します。mysql> use test; mysql> FLUSH TABLES t FOR EXPORT;
メタデータ (
.cfg
) ファイルはInnoDB
データディレクトリに作成されます。注記FLUSH TABLES ... FOR EXPORT
は MySQL 5.6.6 以降で使用できます。このステートメントは、サーバー稼働中にバイナリテーブルのコピーができるように、名前付きテーブルへの変更をディスクにフラッシュします。FLUSH TABLES ... FOR EXPORT
が実行されると、InnoDB
はテーブルと同じデータベースディレクトリに.cfg
ファイルを作成します。.cfg
ファイルには、テーブルスペースファイルをインポートするときのスキーマの検証に使用されるメタデータが含まれます。 -
.ibd
ファイルおよび.cfg
メタデータファイルをソースサーバーから目的サーバーにコピーします。例:shell> scp /path/to/datadir/test/t.{ibd,cfg} destination-server:/path/to/datadir/test
注記.ibd
ファイルおよび.cfg
ファイルは、次の手順で示すように、共有ロックを解放する前にコピーする必要があります。 -
ソースサーバーでは、
UNLOCK TABLES
を使用して、FLUSH TABLES ... FOR EXPORT
によって取得されたロックを解放します。mysql> use test; mysql> UNLOCK TABLES;
-
目的サーバーで、テーブルスペースをインポートします。
mysql> use test; mysql> ALTER TABLE t IMPORT TABLESPACE;
注記ALTER TABLE ... IMPORT TABLESPACE
機能は、インポートされたデータに対して外部キー制約を課しません。テーブル間に外部キー制約がある場合、すべてのテーブルを同じ (論理上の) 時点でエクスポートしてください。この場合、テーブルの更新を停止し、すべてのトランザクションをコミットし、テーブルで共有ロックを取得してから、エクスポート操作を実行します。
テーブルスペースのコピーの内部情報 (トランスポータブルテーブルスペース)
次の情報では、トランスポータブルテーブルスペースのコピー手順に関する内部情報とエラーログについて説明します。
ALTER TABLE ... DISCARD TABLESPACE
が目的のインスタンスで実行された場合。
テーブルは X モードでロックされています。
テーブルスペースがテーブルから切り離されています。
FLUSH TABLES ... FOR EXPORT
がソースインスタンスで実行された場合。
エクスポートのためにフラッシュされたテーブルが共有モードでロックされています。
パージコーディネータのスレッドが停止しています。
ダーティーページがディスクに同期しています。
テーブルのメタデータがバイナリの
.cfg
ファイルに書き込まれました。
この操作で予想されるエラーログメッセージです。
2013-07-18 14:47:31 34471 [Note] InnoDB: Sync to disk of '"test"."t"' started.
2013-07-18 14:47:31 34471 [Note] InnoDB: Stopping purge
2013-07-18 14:47:31 34471 [Note] InnoDB: Writing table metadata to './test/t.cfg'
2013-07-18 14:47:31 34471 [Note] InnoDB: Table '"test"."t"' flushed to disk
UNLOCK TABLES
がソースインスタンスで実行された場合。
バイナリの .cfg ファイルが削除されました。
インポートされたテーブル (または複数のテーブル) の共有ロックが解放され、パージコーディネータのスレッドが再起動されました。
この操作で予想されるエラーログメッセージです。
2013-07-18 15:01:40 34471 [Note] InnoDB: Deleting the meta-data file './test/t.cfg'
2013-07-18 15:01:40 34471 [Note] InnoDB: Resuming purge
ALTER TABLE ... IMPORT TABLESPACE
が目的のインスタンスで実行されると、インポートのアルゴリズムはインポートされたテーブルスペースごとに次の操作を実行します。
テーブルスペースの各ページに破損があるかどうかをチェックします。
各ページのスペース ID とログシーケンス番号 (LSN) が更新されます。
フラグが検証され、ヘッダーページの LSN が更新されます。
B ツリーページが更新されます。
ページの状態がディスクに書き込まれるように、この状態をダーティーに設定します。
この操作で予想されるエラーログメッセージです。
2013-07-18 15:15:01 34960 [Note] InnoDB: Importing tablespace for table 'test/t' that was exported from host 'ubuntu'
2013-07-18 15:15:01 34960 [Note] InnoDB: Phase I - Update all pages
2013-07-18 15:15:01 34960 [Note] InnoDB: Sync to disk
2013-07-18 15:15:01 34960 [Note] InnoDB: Sync to disk - done!
2013-07-18 15:15:01 34960 [Note] InnoDB: Phase III - Flush changes to disk
2013-07-18 15:15:01 34960 [Note] InnoDB: Phase IV - Flush complete
テーブルスペースが破棄されたこと (目的のテーブルのテーブルスペースを破棄した場合) を伝える警告、および .ibd
ファイルがないために統計値が計算できなかったことを伝えるメッセージも受け取る場合があります。
2013-07-18 15:14:38 34960 [Warning] InnoDB: Table "test"."t" tablespace is set as discarded.
2013-07-18 15:14:38 7f34d9a37700 InnoDB: cannot calculate statistics for table "test"."t" because the .ibd file is missing. For help, please refer to
http://dev.mysql.com/doc/refman/5.7/en/innodb-troubleshooting.html