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


15.6.3.3 一般テーブルスペース

一般的なテーブルスペースは、CREATE TABLESPACE 構文を使用して作成される共有 InnoDB テーブルスペースです。 テーブルスペースの一般的な機能については、このセクションの次のトピックで説明します:

一般的なテーブルスペース機能

一般的なテーブルスペース機能には、次の機能があります:

  • システムテーブルスペースと同様に、一般テーブルスペースは、複数のテーブルのデータを格納できる共有テーブルスペースです。

  • 一般的なテーブルスペースには、file-per-table tablespaces よりも潜在的なメモリー上の利点があります。 サーバーは、テーブルスペースの存続期間中、テーブルスペースメタデータをメモリーに保持します。 一般的なテーブルスペースが少ない複数のテーブルは、個別の file-per-table テーブルスペース内の同じ数のテーブルよりも、テーブルスペースメタデータのメモリー消費量が少なくなります。

  • 一般的なテーブルスペースデータファイルは、MySQL データディレクトリに対して相対的または独立したディレクトリに配置できます。これにより、file-per-table tablespaces のデータファイルおよび記憶域管理機能の多くが提供されます。 file-per-table テーブルスペースと同様に、MySQL データディレクトリ外にデータファイルを配置する機能を使用すると、重要なテーブルのパフォーマンスを個別に管理したり、特定のテーブル用に RAID または DRBD を設定したり、テーブルを特定のディスクにバインドしたりできます。

  • 一般テーブルスペースでは、すべてのテーブルの行フォーマットおよび関連機能がサポートされています。

  • TABLESPACE オプションを CREATE TABLE とともに使用すると、一般的なテーブルスペース、file-per-table テーブルスペースまたは system テーブルスペースにテーブルを作成できます。

  • TABLESPACE オプションを ALTER TABLE とともに使用すると、一般的なテーブルスペース、file-per-table テーブルスペースおよびシステムテーブルスペース間でテーブルを移動できます。 以前は、file-per-table テーブルスペースから system テーブルスペースにテーブルを移動できませんでした。 一般テーブルスペース機能を使用して、これを実行できるようになりました。

一般的なテーブルスペースの作成

一般テーブルスペースは、CREATE TABLESPACE 構文を使用して作成されます。

CREATE TABLESPACE tablespace_name
    [ADD DATAFILE 'file_name']
    [FILE_BLOCK_SIZE = value]
        [ENGINE [=] engine_name]

一般的なテーブルスペースは、データディレクトリ内またはその外部に作成できます。 暗黙的に作成された file-per-table テーブルスペースとの競合を回避するために、データディレクトリの下のサブディレクトリに一般テーブルスペースを作成することはサポートされていません。 データディレクトリ外に一般的なテーブルスペースを作成する場合、そのディレクトリが存在し、テーブルスペースを作成する前に InnoDB で認識されている必要があります。 不明なディレクトリを InnoDB で認識できるようにするには、ディレクトリを innodb_directories 引数値に追加します。innodb_directories は読取り専用の起動オプションです。 構成するには、サーバーを再起動する必要があります。

例:

データディレクトリに一般的なテーブルスペースを作成します:

mysql> CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' Engine=InnoDB;

または

mysql> CREATE TABLESPACE `ts1` Engine=InnoDB;

ADD DATAFILE 句は、MySQL 8.0.14 の時点ではオプションであり、その前に必要です。 テーブルスペースの作成時に ADD DATAFILE 句が指定されていない場合、一意のファイル名を持つテーブルスペースデータファイルが暗黙的に作成されます。 一意のファイル名は、ダッシュ (aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee) で区切られた 16 進数の 5 つのグループにフォーマットされた 128 ビット UUID です。 一般的なテーブルスペースデータファイルには、.ibd ファイル拡張子が含まれます。 レプリケーション環境では、ソースで作成されたデータファイル名は、レプリカで作成されたデータファイル名と同じではありません。

データディレクトリ外のディレクトリに一般テーブルスペースを作成します:

mysql> CREATE TABLESPACE `ts1` ADD DATAFILE '/my/tablespace/directory/ts1.ibd' Engine=InnoDB;

テーブルスペースディレクトリがデータディレクトリの下にないかぎり、データディレクトリへの相対パスを指定できます。 この例では、my_tablespace ディレクトリはデータディレクトリと同じレベルにあります:

mysql> CREATE TABLESPACE `ts1` ADD DATAFILE '../my_tablespace/ts1.ibd' Engine=InnoDB;
注記

ENGINE = InnoDB 句を CREATE TABLESPACE ステートメントの一部として定義するか、InnoDB をデフォルトのストレージエンジン (default_storage_engine=InnoDB) として定義する必要があります。

一般テーブルスペースへのテーブルの追加

InnoDB の一般テーブルスペースを作成した後、次の例に示すように、CREATE TABLE tbl_name ... TABLESPACE [=] tablespace_name または ALTER TABLE tbl_name TABLESPACE [=] tablespace_name を使用してテーブルスペースにテーブルを追加できます:

CREATE TABLE:

mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE ts1;

ALTER TABLE:

mysql> ALTER TABLE t2 TABLESPACE ts1;
注記

共有テーブルスペースへのテーブルパーティションの追加のサポートは、MySQL 5.7.24 で非推奨になり、MySQL 8.0.13 で削除されました。 共有テーブルスペースには、InnoDB システムテーブルスペースおよび一般テーブルスペースが含まれます。

構文の詳細は、CREATE TABLE および ALTER TABLE を参照してください。

一般的なテーブルスペースの行形式のサポート

一般テーブルスペースでは、物理ページサイズが異なるために圧縮テーブルと非圧縮テーブルを同じ一般テーブルスペースに共存できないという注意事項があるすべてのテーブルの行形式 (REDUNDANT, COMPACT, DYNAMIC, COMPRESSED) がサポートされています。

一般的なテーブルスペースに圧縮テーブル (ROW_FORMAT=COMPRESSED) を含めるには、FILE_BLOCK_SIZE を指定する必要があり、FILE_BLOCK_SIZE 値は innodb_page_size 値と比較した有効な圧縮ページサイズである必要があります。 また、圧縮テーブル (KEY_BLOCK_SIZE) の物理ページサイズは FILE_BLOCK_SIZE/1024 と同じである必要があります。 たとえば、innodb_page_size=16KB および FILE_BLOCK_SIZE=8K の場合、テーブルの KEY_BLOCK_SIZE は 8 である必要があります。

次のテーブルに、許可される innodb_page_sizeFILE_BLOCK_SIZE および KEY_BLOCK_SIZE の組合せを示します。 FILE_BLOCK_SIZE 値はバイト単位で指定することもできます。 特定の FILE_BLOCK_SIZE に対して有効な KEY_BLOCK_SIZE 値を決定するには、FILE_BLOCK_SIZE 値を 1024 で除算します。 テーブル圧縮では、32K および 64K の InnoDB ページサイズはサポートされていません。 KEY_BLOCK_SIZE の詳細は、CREATE TABLE および セクション15.9.1.2「圧縮テーブルの作成」 を参照してください。

表 15.3 圧縮テーブルで許可されるページサイズ、FILE_BLOCK_SIZE および KEY_BLOCK_SIZE の組合せ

InnoDB ページサイズ (innodb_page_size) 許可される FILE_BLOCK_SIZE 値 許可される KEY_BLOCK_SIZE 値
64KB 64K (65536) 圧縮はサポートされません
32KB 32K (32768) 圧縮はサポートされません
16KB 16K (16384) N/A: innodb_page_sizeFILE_BLOCK_SIZE と等しい場合、テーブルスペースに圧縮テーブルを含めることはできません。
16KB 8K (8192) 8
16KB 4K (4096) 4
16KB 2K (2048) 2
16KB 1K (1024) 1
8KB 8K (8192) N/A: innodb_page_sizeFILE_BLOCK_SIZE と等しい場合、テーブルスペースに圧縮テーブルを含めることはできません。
8KB 4K (4096) 4
8KB 2K (2048) 2
8KB 1K (1024) 1
4KB 4K (4096) N/A: innodb_page_sizeFILE_BLOCK_SIZE と等しい場合、テーブルスペースに圧縮テーブルを含めることはできません。
4KB 2K (2048) 2
4KB 1K (1024) 1

この例では、一般的なテーブルスペースを作成し、圧縮テーブルを追加する方法を示します。 この例では、デフォルトの innodb_page_size が 16KB であると想定しています。 8192 の FILE_BLOCK_SIZE では、圧縮テーブルの KEY_BLOCK_SIZE が 8 である必要があります。

mysql> CREATE TABLESPACE `ts2` ADD DATAFILE 'ts2.ibd' FILE_BLOCK_SIZE = 8192 Engine=InnoDB;

mysql> CREATE TABLE t4 (c1 INT PRIMARY KEY) TABLESPACE ts2 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;

一般テーブルスペースの作成時に FILE_BLOCK_SIZE を指定しない場合、FILE_BLOCK_SIZE はデフォルトで innodb_page_size に設定されます。 FILE_BLOCK_SIZEinnodb_page_size と等しい場合、テーブルスペースには、圧縮されていない行形式 (COMPACTREDUNDANT および DYNAMIC の行形式) のテーブルのみを含めることができます。

ALTER TABLE を使用したテーブルスペース間のテーブルの移動

ALTER TABLETABLESPACE オプションとともに使用して、テーブルを既存の一般テーブルスペース、新しい file-per-table テーブルスペースまたはシステムテーブルスペースに移動できます。

注記

共有テーブルスペースへのテーブルパーティションの配置のサポートは、MySQL 5.7.24 で非推奨になり、MySQL 8.0.13 が削除されました。 共有テーブルスペースには、InnoDB システムテーブルスペースおよび一般テーブルスペースが含まれます。

file-per-table テーブルスペースまたは system テーブルスペースから general テーブルスペースにテーブルを移動するには、general テーブルスペースの名前を指定します。 一般テーブルスペースが存在する必要があります。 詳細は、CREATE TABLESPACE を参照してください。

ALTER TABLE tbl_name TABLESPACE [=] tablespace_name;

一般的なテーブルスペースまたはファイルごとのテーブルスペースからシステムテーブルスペースにテーブルを移動するには、テーブルスペース名として innodb_system を指定します。

ALTER TABLE tbl_name TABLESPACE [=] innodb_system;

システムテーブルスペースまたは一般テーブルスペースから file-per-table テーブルスペースにテーブルを移動するには、テーブルスペース名として innodb_file_per_table を指定します。

ALTER TABLE tbl_name TABLESPACE [=] innodb_file_per_table;

ALTER TABLE ... TABLESPACE 操作では、TABLESPACE 属性が以前の値から変更されていない場合でも、常に全テーブルが再構築されます。

ALTER TABLE ... TABLESPACE 構文では、一時テーブルスペースから永続テーブルスペースへのテーブルの移動はサポートされていません。

DATA DIRECTORY 句は CREATE TABLE ... TABLESPACE=innodb_file_per_table で使用できますが、それ以外の場合は TABLESPACE オプションと組み合せて使用することはサポートされていません。 MySQL 8.0.21 では、DATA DIRECTORY 句で指定されたディレクトリは InnoDB で認識されている必要があります。 詳細は、DATA DIRECTORY 句の使用を参照してください。

暗号化されたテーブルスペースからテーブルを移動する場合は、制限が適用されます。 暗号化の制限事項を参照してください。

一般テーブルスペースの名前の変更

一般的なテーブルスペースの名前変更は、ALTER TABLESPACE ... RENAME TO 構文を使用してサポートされます。

ALTER TABLESPACE s1 RENAME TO s2;

一般的なテーブルスペースの名前を変更するには、CREATE TABLESPACE 権限が必要です。

RENAME TO 操作は、autocommit の設定に関係なく、autocommit モードで暗黙的に実行されます。

テーブルスペースに存在するテーブルに対して LOCK TABLES または FLUSH TABLES WITH READ LOCK が有効になっている間は、RENAME TO 操作を実行できません。

排他的 metadata locks は、テーブルスペースの名前が変更されている間、一般的なテーブルスペース内のテーブルに対して取得されるため、同時 DDL が回避されます。 同時 DML がサポートされています。

一般テーブルスペースの削除

DROP TABLESPACE ステートメントを使用して、InnoDB の一般テーブルスペースを削除します。

DROP TABLESPACE 操作の前に、すべてのテーブルをテーブルスペースから削除する必要があります。 テーブルスペースが空でない場合、DROP TABLESPACE はエラーを返します。

一般的なテーブルスペースのテーブルを識別するには、次のようなクエリーを使用します。

mysql> SELECT a.NAME AS space_name, b.NAME AS table_name FROM INFORMATION_SCHEMA.INNODB_TABLESPACES a,
       INFORMATION_SCHEMA.INNODB_TABLES b WHERE a.SPACE=b.SPACE AND a.NAME LIKE 'ts1';
+------------+------------+
| space_name | table_name |
+------------+------------+
| ts1        | test/t1    |
| ts1        | test/t2    |
| ts1        | test/t3    |
+------------+------------+

一般的な InnoDB テーブルスペースは、テーブルスペースの最後のテーブルが削除されても自動的には削除されません。 テーブルスペースは、DROP TABLESPACE tablespace_name を使用して明示的に削除する必要があります。

一般テーブルスペースは、特定のデータベースに属していません。 DROP DATABASE 操作では、一般的なテーブルスペースに属するテーブルを削除できますが、DROP DATABASE 操作でテーブルスペースに属するすべてのテーブルを削除しても、テーブルスペースは削除できません。 一般テーブルスペースは、DROP TABLESPACE tablespace_name を使用して明示的に削除する必要があります。

システムテーブルスペースと同様に、一般テーブルスペースに格納されているテーブルの切捨てまたは削除によって、新しい InnoDB データにのみ使用できる空き領域が一般テーブルスペース .ibd data file に内部的に作成されます。 DROP TABLE 操作中に file-per-table テーブルスペースが削除された場合とは異なり、領域はオペレーティングシステムに解放されません。

この例では、InnoDB の一般テーブルスペースを削除する方法を示します。 一般的なテーブルスペース ts1 は、単一のテーブルで作成されます。 テーブルスペースを削除する前に、テーブルを削除する必要があります。

mysql> CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' Engine=InnoDB;

mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE ts1 Engine=InnoDB;

mysql> DROP TABLE t1;

mysql> DROP TABLESPACE ts1;
注記

tablespace_name は、MySQL では大/小文字が区別される識別子です。

テーブルスペースの一般的な制限事項
  • 生成されたテーブルスペースまたは既存のテーブルスペースを一般テーブルスペースに変更することはできません。

  • 一時一般テーブルスペースの作成はサポートされていません。

  • 一般テーブルスペースでは、一時テーブルはサポートされていません。

  • システムテーブルスペースと同様に、一般テーブルスペースに格納されているテーブルの切捨てまたは削除によって、新しい InnoDB データにのみ使用できる空き領域が一般テーブルスペース .ibd data file に内部的に作成されます。 領域は、file-per-table テーブルスペース用であるため、オペレーティングシステムに解放されません。

    また、共有テーブルスペース (一般テーブルスペースまたはシステムテーブルスペース) に存在するテーブルに対するテーブルコピー ALTER TABLE 操作によって、テーブルスペースで使用される領域の量を増やすことができます。 このような操作には、テーブルのデータとインデックスと同じ追加領域が必要です。 テーブルのコピー ALTER TABLE 操作に必要な追加領域は、file-per-table テーブルスペース用であるため、オペレーティングシステムに解放されません。

  • ALTER TABLE ... DISCARD TABLESPACE および ALTER TABLE ...IMPORT TABLESPACE は、一般テーブルスペースに属するテーブルではサポートされていません。

  • 一般的なテーブルスペースへのテーブルパーティションの配置のサポートは、MySQL 5.7.24 で非推奨になり、MySQL 8.0.13 で削除されました。

  • ADD DATAFILE 句は、ソースとレプリカが同じホストに存在するレプリケーション環境ではサポートされません。これは、ソースとレプリカが同じ場所に同じ名前のテーブルスペースを作成するためですが、これはサポートされていないためです。 ただし、ADD DATAFILE 句を省略した場合、テーブルスペースは一意の生成済ファイル名でデータディレクトリに作成されますが、これは許可されます。

  • MySQL 8.0.21 では、InnoDB で直接認識されていないかぎり、undo テーブルスペースディレクトリ (innodb_undo_directory) に一般テーブルスペースを作成できません。 既知のディレクトリは、datadirinnodb_data_home_dir および innodb_directories 変数で定義されているディレクトリです。


関連キーワード:  テーブル, スペース, InnoDB, 一般, TABLESPACE, TABLE, 作成, SIZE, BLOCK, 圧縮