新しい InnoDB
file-per-table テーブルスペースを MySQL データディレクトリの外側の特定の位置に作成するには、CREATE TABLE
ステートメントの DATA DIRECTORY =
句を使用します。
absolute_path_to_directory
あらかじめ位置について計画を立てます。ALTER TABLE
ステートメントで DATA DIRECTORY
句を使用できないためです。指定するディレクトリは、高速の SSD や大容量の HDD など、パフォーマンスや容量に際だった特徴のあるほかのストレージデバイス上に置くことも可能です。
MySQL は、目的のディレクトリ内にデータベース名に対応するサブディレクトリを作成し、その中に、新しいテーブル用の .ibd ファイル を作成します。MySQL は、MySQL DATADIR
ディレクトリの下のデータベースディレクトリに、テーブルのパス名を含む
ファイル作成します。.isl file は MySQL によってシンボリックリンクのように処理されます。(実際のシンボリックリンクを使用することは table_name
.islInnoDB
テーブルではサポートされませんでした。)
次の例では、MySQL の開発またはテスト用の小さなインスタンスを、95% が使用済みのプライマリハードドライブを搭載したノート型パソコンで実行し、空きスペースが多い別のストレージデバイス上に名前が EXTERNAL
の新しいテーブルを配置する方法について示します。シェルコマンドは、DATADIR
ディレクトリの下のデフォルトの位置にある LOCAL
テーブルおよび指定した位置にある EXTERNAL
テーブルへのさまざまなパスを示します。
mysql> \! df -k .
Filesystem 1024-blocks Used Available Capacity iused ifree %iused Mounted on
/dev/disk0s2 244277768 231603532 12418236 95% 57964881 3104559 95% /
mysql> use test;
Database changed
mysql> show variables like 'innodb_file_per_table';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | ON |
+-----------------------+-------+
1 row in set (0.00 sec)
mysql> \! pwd
/usr/local/mysql
mysql> create table local (x int unsigned not null primary key);
Query OK, 0 rows affected (0.03 sec)
mysql> \! ls -l data/test/local.ibd
-rw-rw---- 1 cirrus staff 98304 Nov 13 15:24 data/test/local.ibd
mysql> create table external (x int unsigned not null primary key) data directory = '/volumes/external1/data';
Query OK, 0 rows affected (0.03 sec)
mysql> \! ls -l /volumes/external1/data/test/external.ibd
-rwxrwxrwx 1 cirrus staff 98304 Nov 13 15:34 /volumes/external1/data/test/external.ibd
mysql> select count(*) from local;
+----------+
| count(*) |
+----------+
| 0 |
+----------+
1 row in set (0.01 sec)
mysql> select count(*) from external;
+----------+
| count(*) |
+----------+
| 0 |
+----------+
1 row in set (0.01 sec)
-
最初、MySQL は
.ibd
ファイルを開いたままにして、デバイスがマウント解除されないようにしていますが、サーバーがビジーになると、結果的にテーブルを閉じることになる場合があります。MySQL の動作中に誤って外部デバイスをマウント解除したり、デバイスが接続されていないときに MySQL を起動したりしないように注意してください。関連する.ibd
ファイルが欠けているときにテーブルにアクセスしようとすると、サーバーの再起動が必要となる重大なエラーの原因となります。それでも
.ibd
ファイルが期待するパス上にない場合、サーバーの再起動が失敗する可能性があります。この場合、手動でデータベースディレクトリ内の
ファイルを削除し、再起動後にtable_name
.islDROP TABLE
を実行して.frm
ファイルを削除し、テーブルに関する情報をデータディクショナリから削除します。 NFS がマウントされたボリュームに MySQL テーブルを配置しないでください。NFS はメッセージパッシングプロトコルを使用してファイルに書き込むため、ネットワークメッセージが失われたり、順序どおりに受信しなかったりした場合に、データの一貫性が失われる原因となる可能性があります。
LVM スナップショット、ファイルのコピー、または他のファイルベースのメカニズムを使用して、
.ibd
ファイルのバックアップを取る場合、必ず最初にFLUSH TABLES ... FOR EXPORT
ステートメントを使用して、メモリーにバッファリングされたすべての変更が、バックアップを行う前にディスクにフラッシュされていることを確認します。DATA DIRECTORY
句は シンボリックリンクの使用 のサポート済み代替手段です。これはずっと問題があり、各InnoDB
テーブルには決してサポートされませんでした。