MySQL 8.0 リファレンスマニュアル


15.6.1.2 外部でのテーブルの作成

InnoDB テーブルを外部で作成する (つまり、データディレクトリ外でテーブルを作成する) 理由は様々です。 このような理由には、領域管理、I/O の最適化、特定のパフォーマンスまたは容量特性を持つストレージデバイスへのテーブルの配置などがあります。

InnoDB では、テーブルを外部で作成するために次の方法がサポートされています:

DATA DIRECTORY 句の使用

外部ディレクトリに InnoDB テーブルを作成するには、CREATE TABLE ステートメントで DATA DIRECTORY 句を指定します。

CREATE TABLE t1 (c1 INT PRIMARY KEY) DATA DIRECTORY = '/external/directory';

file-per-table テーブルスペースに作成されたテーブルでは、DATA DIRECTORY 句がサポートされています。 innodb_file_per_table 変数が有効になっている場合 (デフォルト)、テーブルは file-per-table テーブルスペースに暗黙的に作成されます。

mysql> SELECT @@innodb_file_per_table;
+-------------------------+
| @@innodb_file_per_table |
+-------------------------+
|                       1 |
+-------------------------+

file-per-table テーブルスペースの詳細は、セクション15.6.3.2「File-Per-Table テーブルスペース」 を参照してください。

CREATE TABLE ステートメントで DATA DIRECTORY 句を指定すると、指定したディレクトリの下のスキーマディレクトリにテーブルデータファイル (table_name.ibd) が作成されます。

MySQL 8.0.21 では、DATA DIRECTORY 句を使用してデータディレクトリの外部で作成されるテーブルおよびテーブルパーティションは、InnoDB で認識されるディレクトリに制限されます。 この要件により、データベース管理者はテーブルスペースデータファイルが作成される場所を制御し、リカバリ中にデータファイルを検出できるようになります (クラッシュリカバリ中のテーブルスペースの検出 を参照)。 既知のディレクトリは、datadirinnodb_data_home_dir および innodb_directories 変数で定義されているディレクトリです。 次のステートメントを使用して、これらの設定を確認できます:

mysql> SELECT @@datadir,@@innodb_data_home_dir,@@innodb_directories;

使用するディレクトリが不明な場合は、テーブルを作成する前に innodb_directories 設定に追加します。 innodb_directories 変数は読取り専用です。 構成するには、サーバーを再起動する必要があります。 システム変数の設定に関する一般情報は、セクション5.1.9「システム変数の使用」 を参照してください。

次の例では、DATA DIRECTORY 句を使用して外部ディレクトリにテーブルを作成する方法を示します。 innodb_file_per_table 変数が有効で、ディレクトリが InnoDB に認識されていることを前提としています。

mysql> USE test;
Database changed

mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY) DATA DIRECTORY = '/external/directory';

# MySQL creates the table's data file in a schema directory
# under the external directory

shell> cd /external/directory/test
shell> ls
t1.ibd
使用上の注意:
  • MySQL では、最初にテーブルスペースデータファイルが開いた状態で保持されるため、デバイスをディスマウントできませんが、サーバーがビジー状態の場合は最終的にファイルが閉じられる可能性があります。 MySQL の実行中に外部デバイスを誤ってディスマウントしたり、デバイスの切断中に MySQL を起動したりしないように注意してください。 関連付けられたデータファイルがないときにテーブルにアクセスしようとすると、重大なエラーが発生し、サーバーの再起動が必要になります。

    必要なパスにデータファイルが見つからない場合、サーバーの再起動が失敗することがあります。 この場合、テーブルスペースデータファイルをバックアップからリストアするか、テーブルを削除して data dictionary から削除できます。

  • NFS マウントされたボリュームにテーブルを配置する前に、MySQL での NFS の使用 で概説されている潜在的な問題を確認します。

  • LVM スナップショット、ファイルコピーまたはその他のファイルベースのメカニズムを使用してテーブルデータファイルをバックアップする場合は、バックアップが発生する前に、必ず FLUSH TABLES ... FOR EXPORT ステートメントを使用して、メモリーにバッファリングされるすべての変更が flushed からディスクになるようにします。

  • DATA DIRECTORY 句を使用して外部ディレクトリにテーブルを作成する方法は、InnoDB でサポートされていない symbolic links を使用するかわりに使用する方法です。

  • DATA DIRECTORY 句は、ソースとレプリカが同じホストに存在するレプリケーション環境ではサポートされていません。 DATA DIRECTORY 句には完全なディレクトリパスが必要です。 この場合、パスをレプリケートすると、ソースとレプリカは同じ場所にテーブルを作成します。

  • MySQL 8.0.21 の時点では、file-per-table テーブルスペースで作成されたテーブルは、InnoDB で直接認識されていないかぎり、undo テーブルスペースディレクトリ (innodb_undo_directory) に作成できなくなりました。 既知のディレクトリは、datadirinnodb_data_home_dir および innodb_directories 変数で定義されているディレクトリです。

CREATE TABLE ... TABLESPACE 構文の使用

CREATE TABLE ... TABLESPACE 構文を DATA DIRECTORY 句と組み合せて使用すると、外部ディレクトリにテーブルを作成できます。 これを行うには、テーブルスペース名として innodb_file_per_table を指定します。

mysql> CREATE TABLE t2 (c1 INT PRIMARY KEY) TABLESPACE = innodb_file_per_table
       DATA DIRECTORY = '/external/directory';

この方法は、file-per-table テーブルスペースで作成されたテーブルでのみサポートされますが、innodb_file_per_table 変数を有効にする必要はありません。 他のすべての点では、このメソッドは前述の CREATE TABLE ... DATA DIRECTORY メソッドと同等です。 同じ使用上のノートが適用されます。

外部一般テーブルスペースでのテーブルの作成

外部ディレクトリに存在する一般的なテーブルスペースにテーブルを作成できます。


関連キーワード:  InnoDB, テーブル, スペース, 作成, 構成, ディレクトリ, 外部, DATA, DIRECTORY, file