InnoDB
テーブルを外部で作成する (つまり、データディレクトリ外でテーブルを作成する) 理由は様々です。 このような理由には、領域管理、I/O の最適化、特定のパフォーマンスまたは容量特性を持つストレージデバイスへのテーブルの配置などがあります。
InnoDB
では、テーブルを外部で作成するために次の方法がサポートされています:
外部ディレクトリに 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
で認識されるディレクトリに制限されます。 この要件により、データベース管理者はテーブルスペースデータファイルが作成される場所を制御し、リカバリ中にデータファイルを検出できるようになります (クラッシュリカバリ中のテーブルスペースの検出 を参照)。 既知のディレクトリは、datadir
、innodb_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
) に作成できなくなりました。 既知のディレクトリは、datadir
、innodb_data_home_dir
およびinnodb_directories
変数で定義されているディレクトリです。
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
メソッドと同等です。 同じ使用上のノートが適用されます。
外部ディレクトリに存在する一般的なテーブルスペースにテーブルを作成できます。
外部ディレクトリでの一般的なテーブルスペースの作成の詳細は、一般的なテーブルスペースの作成 を参照してください。
一般的なテーブルスペースでのテーブルの作成の詳細は、一般テーブルスペースへのテーブルの追加 を参照してください。