このセクションでは、file-per-table テーブルスペースおよび general tablespaces でテーブル圧縮機能を使用する際に発生する可能性がある構文の警告およびエラーについて説明します。
File-Per-Table テーブルスペースに対する SQL 圧縮構文の警告およびエラー
innodb_strict_mode
が有効な場合 (デフォルト)、CREATE TABLE
ステートメントまたは ALTER TABLE
ステートメントで ROW_FORMAT=COMPRESSED
または KEY_BLOCK_SIZE
を指定すると、innodb_file_per_table
が無効な場合に次のエラーが生成されます。
ERROR 1031 (HY000): Table storage engine for 't1' doesn't have this option
現在の構成では圧縮テーブルの使用が許可されていないため、テーブルは作成されません。
innodb_strict_mode
が無効になっている場合、CREATE TABLE
または ALTER TABLE
ステートメントで ROW_FORMAT=COMPRESSED
または KEY_BLOCK_SIZE
を指定すると、innodb_file_per_table
が無効になっていると次の警告が生成されます。
mysql> SHOW WARNINGS;
+---------+------+---------------------------------------------------------------+
| Level | Code | Message |
+---------+------+---------------------------------------------------------------+
| Warning | 1478 | InnoDB: KEY_BLOCK_SIZE requires innodb_file_per_table. |
| Warning | 1478 | InnoDB: ignoring KEY_BLOCK_SIZE=4. |
| Warning | 1478 | InnoDB: ROW_FORMAT=COMPRESSED requires innodb_file_per_table. |
| Warning | 1478 | InnoDB: assuming ROW_FORMAT=DYNAMIC. |
+---------+------+---------------------------------------------------------------+
これらのメッセージは単なる警告であり、エラーではありません。オプションが指定されていない場合と同様に、テーブルは圧縮なしで作成されます。
「厳密でない」動作を使用すると、ソースデータベースに圧縮テーブルが含まれていない場合でも、圧縮テーブルがサポートされていないデータベースに mysqldump
ファイルをインポートできます。 その場合、MySQL は、操作を妨げるかわりに ROW_FORMAT=DYNAMIC
にテーブルを作成します。
ダンプファイルを新しいデータベースにインポートし、元のデータベースに存在するとおりにテーブルを再作成するには、サーバーに innodb_file_per_table
構成パラメータの適切な設定があることを確認します。
KEY_BLOCK_SIZE
属性は、ROW_FORMAT
が COMPRESSED
として指定されているか、省略されている場合にのみ許可されます。 その他の ROW_FORMAT
とともに KEY_BLOCK_SIZE
を指定すると、SHOW WARNINGS
を使用して表示できる警告が生成されます。 ただし、テーブルは非圧縮です。つまり、指定された KEY_BLOCK_SIZE
は無視されます。
レベル | コード | メッセージ |
---|---|---|
警告 | 1478 | InnoDB: ignoring KEY_BLOCK_SIZE= |
innodb_strict_mode
が有効になっている状態で実行している場合は、COMPRESSED
以外の任意の ROW_FORMAT
と KEY_BLOCK_SIZE
を組み合わせると警告ではなく、エラーが生成され、テーブルは作成されません。
表15.12「ROW_FORMAT および KEY_BLOCK_SIZE のオプション」 では、CREATE TABLE
または ALTER TABLE
で使用される ROW_FORMAT
および KEY_BLOCK_SIZE
のオプションの概要を示します。
表 15.12 ROW_FORMAT および KEY_BLOCK_SIZE のオプション
オプション | 使用上の注意 | 説明 |
---|---|---|
ROW_FORMAT=REDUNDANT |
MySQL 5.0.3 よりも前で使用されていたストレージフォーマット |
ROW_FORMAT=COMPACT よりも効率性が低く、下位互換性を保つためのものです。 |
ROW_FORMAT=COMPACT |
MySQL 5.0.3 以降でのデフォルトのストレージフォーマット | クラスタ化されたインデックスページに、768 バイトの長いカラム値のプリフィクスが格納され、残りのバイトはオーバーフローページに格納されます。 |
ROW_FORMAT=DYNAMIC |
クラスタ化されたインデックスページ内に収まる場合は、そのページ内に値が保存されます。収まらない場合は、オーバーフローページへの 20 バイトのポインタのみが (プリフィクスなしで) 格納されます。 | |
ROW_FORMAT=COMPRESSED |
zlib を使用してテーブルとインデックスを圧縮 | |
KEY_BLOCK_SIZE= |
圧縮されたページサイズとして 1、2、4、8 または 16 KB を指定します。これは ROW_FORMAT=COMPRESSED を意味します。 一般的なテーブルスペースの場合、InnoDB ページサイズと等しい KEY_BLOCK_SIZE 値は許可されません。 |
表15.13「InnoDB 厳密モードがオフになっているときの CREATE/ALTER TABLE の警告とエラー」では、CREATE TABLE
または ALTER TABLE
ステートメント上で、構成パラメータとオプションの特定の組み合わせで発生するエラー状況、およびオプションが SHOW TABLE STATUS
の出力に表示される方法について簡単に説明しています。
innodb_strict_mode
が OFF
の場合、MySQL によってテーブルが作成または変更されますが、次に示すように特定の設定は無視されます。 警告メッセージは、MySQL エラーログで確認できます。 innodb_strict_mode
が ON
の場合、このような特定のオプションの組み合わせでエラーが生成され、テーブルは作成または変更されません。 エラー状況の完全な説明を参照するには、次に示すように、SHOW ERRORS
ステートメントを発行します。
mysql>CREATE TABLE x (id INT PRIMARY KEY, c INT)
->ENGINE=INNODB KEY_BLOCK_SIZE=33333;
ERROR 1005 (HY000): Can't create table 'test.x' (errno: 1478) mysql>SHOW ERRORS;
+-------+------+-------------------------------------------+ | Level | Code | Message | +-------+------+-------------------------------------------+ | Error | 1478 | InnoDB: invalid KEY_BLOCK_SIZE=33333. | | Error | 1005 | Can't create table 'test.x' (errno: 1478) | +-------+------+-------------------------------------------+
表 15.13 InnoDB 厳密モードがオフになっているときの CREATE/ALTER TABLE の警告とエラー
構文 | 警告またはエラーの状況 | 結果として SHOW TABLE STATUS に表示される ROW_FORMAT
|
---|---|---|
ROW_FORMAT=REDUNDANT |
なし | REDUNDANT |
ROW_FORMAT=COMPACT |
なし | COMPACT |
ROW_FORMAT=COMPRESSED または ROW_FORMAT=DYNAMIC 、または KEY_BLOCK_SIZE が指定されている |
innodb_file_per_table が有効になっていないかぎり、file-per-table テーブルスペースでは無視されます。 一般テーブルスペースでは、すべての行形式がサポートされます。 セクション15.6.3.3「一般テーブルスペース」を参照してください。 |
the default row format for file-per-table tablespaces; the specified row format for general tablespaces |
無効な KEY_BLOCK_SIZE (1、2、4、8、または 16 以外) が指定されている |
KEY_BLOCK_SIZE が無視されます。 |
指定された行フォーマットまたはデフォルトの行フォーマット |
ROW_FORMAT=COMPRESSED および有効な KEY_BLOCK_SIZE が指定されている |
なし。指定した KEY_BLOCK_SIZE が使用されます |
COMPRESSED |
REDUNDANT 、COMPACT 、または DYNAMIC 行フォーマットを使用して KEY_BLOCK_SIZE が指定されている |
KEY_BLOCK_SIZE が無視されます。 |
REDUNDANT 、COMPACT 、または DYNAMIC
|
ROW_FORMAT が REDUNDANT 、COMPACT 、DYNAMIC 、または COMPRESSED のいずれでもない |
MySQL パーサーで認識される場合は無視されます。 その他の場合は、エラーが発行されます。 | デフォルトの行フォーマットまたは N/A |
innodb_strict_mode
が ON
の場合、MySQL は無効な ROW_FORMAT
または KEY_BLOCK_SIZE
パラメータを拒否し、エラーを発行します。 厳密モードはデフォルトで ON
です。 innodb_strict_mode
が OFF
の場合、MySQL は無視された無効なパラメータに対してエラーではなく警告を発行します。
SHOW TABLE STATUS
を使用して選択した KEY_BLOCK_SIZE
を表示できません。 SHOW CREATE TABLE
ステートメントでは、(テーブルの作成時に無視された場合でも) KEY_BLOCK_SIZE
が表示されます。 テーブルの実際の圧縮済みページサイズは、MySQL では表示できません。
一般的なテーブルスペースに対する SQL 圧縮構文の警告およびエラー
-
テーブルスペースの作成時に一般テーブルスペースに対して
FILE_BLOCK_SIZE
が定義されていない場合、テーブルスペースに圧縮テーブルを含めることはできません。 圧縮テーブルを追加しようとすると、次の例に示すようにエラーが返されます:mysql> CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' Engine=InnoDB; mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE ts1 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8; ERROR 1478 (HY000): InnoDB: Tablespace `ts1` cannot contain a COMPRESSED table
-
無効な
KEY_BLOCK_SIZE
を含むテーブルを一般テーブルスペースに追加しようとすると、次の例に示すようにエラーが返されます:mysql> CREATE TABLESPACE `ts2` ADD DATAFILE 'ts2.ibd' FILE_BLOCK_SIZE = 8192 Engine=InnoDB; mysql> CREATE TABLE t2 (c1 INT PRIMARY KEY) TABLESPACE ts2 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4; ERROR 1478 (HY000): InnoDB: Tablespace `ts2` uses block size 8192 and cannot contain a table with physical page size 4096
一般的なテーブルスペースの場合、テーブルの
KEY_BLOCK_SIZE
は、テーブルスペースのFILE_BLOCK_SIZE
を 1024 で割ったものである必要があります。 たとえば、テーブルスペースのFILE_BLOCK_SIZE
が 8192 の場合、テーブルのKEY_BLOCK_SIZE
は 8 である必要があります。 -
圧縮されていない行形式のテーブルを、圧縮テーブルを格納するように構成された一般的なテーブルスペースに追加しようとすると、次の例に示すようにエラーが返されます:
mysql> CREATE TABLESPACE `ts3` ADD DATAFILE 'ts3.ibd' FILE_BLOCK_SIZE = 8192 Engine=InnoDB; mysql> CREATE TABLE t3 (c1 INT PRIMARY KEY) TABLESPACE ts3 ROW_FORMAT=COMPACT; ERROR 1478 (HY000): InnoDB: Tablespace `ts3` uses block size 8192 and cannot contain a table with physical page size 16384
innodb_strict_mode
は、一般的なテーブルスペースには適用できません。 一般的なテーブルスペースのテーブルスペース管理ルールは、innodb_strict_mode
とは無関係に厳密に適用されます。 詳細は、セクション13.1.21「CREATE TABLESPACE ステートメント」を参照してください。
一般的なテーブルスペースでの圧縮テーブルの使用の詳細は、セクション15.6.3.3「一般テーブルスペース」 を参照してください。