このページは機械翻訳したものです。
このセクションでは、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「一般テーブルスペース」 を参照してください。