一般的なテーブルスペースは、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_size
、FILE_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_size が FILE_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_size が FILE_BLOCK_SIZE と等しい場合、テーブルスペースに圧縮テーブルを含めることはできません。 |
8KB | 4K (4096) | 4 |
8KB | 2K (2048) | 2 |
8KB | 1K (1024) | 1 |
4KB | 4K (4096) | N/A: innodb_page_size が FILE_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_SIZE
が innodb_page_size
と等しい場合、テーブルスペースには、圧縮されていない行形式 (COMPACT
、REDUNDANT
および DYNAMIC
の行形式) のテーブルのみを含めることができます。
ALTER TABLE
を TABLESPACE
オプションとともに使用して、テーブルを既存の一般テーブルスペース、新しい 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;
は、MySQL では大/小文字が区別される識別子です。
tablespace_name
生成されたテーブルスペースまたは既存のテーブルスペースを一般テーブルスペースに変更することはできません。
一時一般テーブルスペースの作成はサポートされていません。
一般テーブルスペースでは、一時テーブルはサポートされていません。
-
システムテーブルスペースと同様に、一般テーブルスペースに格納されているテーブルの切捨てまたは削除によって、新しい
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
) に一般テーブルスペースを作成できません。 既知のディレクトリは、datadir
、innodb_data_home_dir
およびinnodb_directories
変数で定義されているディレクトリです。