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


15.9.1.7 SQL 圧縮構文の警告とエラー

このセクションでは、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_FORMATCOMPRESSED として指定されているか、省略されている場合にのみ許可されます。 その他の ROW_FORMAT とともに KEY_BLOCK_SIZE を指定すると、SHOW WARNINGS を使用して表示できる警告が生成されます。 ただし、テーブルは非圧縮です。つまり、指定された KEY_BLOCK_SIZE は無視されます。

レベル コード メッセージ
警告 1478 InnoDB: ignoring KEY_BLOCK_SIZE=n unless ROW_FORMAT=COMPRESSED.

innodb_strict_mode が有効になっている状態で実行している場合は、COMPRESSED 以外の任意の ROW_FORMATKEY_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=n 圧縮されたページサイズとして 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_modeOFF の場合、MySQL によってテーブルが作成または変更されますが、次に示すように特定の設定は無視されます。 警告メッセージは、MySQL エラーログで確認できます。 innodb_strict_modeON の場合、このような特定のオプションの組み合わせでエラーが生成され、テーブルは作成または変更されません。 エラー状況の完全な説明を参照するには、次に示すように、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
REDUNDANTCOMPACT、または DYNAMIC 行フォーマットを使用して KEY_BLOCK_SIZE が指定されている KEY_BLOCK_SIZE が無視されます。 REDUNDANTCOMPACT、または DYNAMIC
ROW_FORMATREDUNDANTCOMPACTDYNAMIC、または COMPRESSED のいずれでもない MySQL パーサーで認識される場合は無視されます。 その他の場合は、エラーが発行されます。 デフォルトの行フォーマットまたは N/A

innodb_strict_modeON の場合、MySQL は無効な ROW_FORMAT または KEY_BLOCK_SIZE パラメータを拒否し、エラーを発行します。 厳密モードはデフォルトで ON です。 innodb_strict_modeOFF の場合、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「一般テーブルスペース」 を参照してください。


関連キーワード:  InnoDB, テーブル, SIZE, BLOCK, KEY, スペース, 圧縮, FORMAT, 構成, エラー