Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 27.1Mb
PDF (A4) - 27.2Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


14.5.4 テーブルスペースの位置の指定

新しい InnoDB file-per-table テーブルスペースを MySQL データディレクトリの外側の特定の位置に作成するには、CREATE TABLE ステートメントの DATA DIRECTORY = absolute_path_to_directory 句を使用します。

あらかじめ位置について計画を立てます。ALTER TABLE ステートメントで DATA DIRECTORY 句を使用できないためです。指定するディレクトリは、高速の SSD や大容量の HDD など、パフォーマンスや容量に際だった特徴のあるほかのストレージデバイス上に置くことも可能です。

MySQL は、目的のディレクトリ内にデータベース名に対応するサブディレクトリを作成し、その中に、新しいテーブル用の .ibd ファイル を作成します。MySQL は、MySQL DATADIR ディレクトリの下のデータベースディレクトリに、テーブルのパス名を含む table_name.isl ファイル作成します。.isl file は MySQL によってシンボリックリンクのように処理されます。(実際のシンボリックリンクを使用することInnoDB テーブルではサポートされませんでした。)

次の例では、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.isl ファイルを削除し、再起動後に DROP TABLE を実行して .frm ファイルを削除し、テーブルに関する情報をデータディクショナリから削除します。

  • NFS がマウントされたボリュームに MySQL テーブルを配置しないでください。NFS はメッセージパッシングプロトコルを使用してファイルに書き込むため、ネットワークメッセージが失われたり、順序どおりに受信しなかったりした場合に、データの一貫性が失われる原因となる可能性があります。

  • LVM スナップショット、ファイルのコピー、または他のファイルベースのメカニズムを使用して、.ibd ファイルのバックアップを取る場合、必ず最初に FLUSH TABLES ... FOR EXPORT ステートメントを使用して、メモリーにバッファリングされたすべての変更が、バックアップを行う前にディスクにフラッシュされていることを確認します。

  • DATA DIRECTORY 句は シンボリックリンクの使用 のサポート済み代替手段です。これはずっと問題があり、各 InnoDB テーブルには決してサポートされませんでした。


User Comments
Sign Up Login You must be logged in to post a comment.