14.9.1.7 SQL 压缩语法警告和错误

本节介绍将 table 压缩功能与file-per-tabletable 空间和general tablespaces一起使用时可能遇到的语法警告和错误。

每 table 文件 table 空间的 SQL 压缩语法警告和错误

启用innodb_strict_mode时(默认设置),如果禁用innodb_file_per_table或将innodb_file_format设置为Antelope而不是Barracuda,则在CREATE TABLEALTER TABLE语句中指定ROW_FORMAT=COMPRESSEDKEY_BLOCK_SIZE会产生以下错误。

ERROR 1031 (HY000): Table storage engine for 't1' doesn't have this option

Note

如果当前配置不允许使用压缩 table,则不会创建该 table。

禁用innodb_strict_mode时,如果禁用innodb_file_per_table,则在CREATE TABLEALTER TABLE语句中指定ROW_FORMAT=COMPRESSEDKEY_BLOCK_SIZE会产生以下警告。

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.                          |
+---------+------+---------------------------------------------------------------+

如果将innodb_file_format设置为Antelope而不是Barracuda,则会发出类似的警告。

Note

这些消息仅是警告,不是错误,并且创建 table 时没有进行压缩,就像未指定选项一样。

通过“非严格”行为,即使源数据库包含压缩 table,也可以将mysqldump文件导入不支持压缩 table 的数据库中。在这种情况下,MySQL 会在ROW_FORMAT=COMPACT中创建 table,而不是阻止该操作。

要将转储文件导入到新数据库中,并重新创建原始数据库中存在的 table,请确保服务器对配置参数innodb_file_formatinnodb_file_per_table进行了正确的设置。

仅当将ROW_FORMAT指定为COMPRESSED或将其省略时,才允许属性KEY_BLOCK_SIZE。与其他ROW_FORMAT一起指定KEY_BLOCK_SIZE会生成警告,您可以使用SHOW WARNINGS查看。但是,该 table 是未压缩的。指定的KEY_BLOCK_SIZE被忽略)。

LevelCodeMessage
Warning1478InnoDB: ignoring KEY_BLOCK_SIZE=n unless ROW_FORMAT=COMPRESSED.

如果在启用innodb_strict_mode的情况下运行,则KEY_BLOCK_SIZECOMPRESSED以外的任何ROW_FORMAT的组合会生成错误(不是警告),并且不会创建 table。

table14.6,“ ROW_FORMAT 和 KEY_BLOCK_SIZE 选项”概述了与CREATE TABLEALTER TABLE一起使用的ROW_FORMATKEY_BLOCK_SIZE选项。

table14.6 ROW_FORMAT 和 KEY_BLOCK_SIZE 选项

OptionUsage NotesDescription
ROW_FORMAT=REDUNDANTMySQL 5.0.3 之前使用的存储格式ROW_FORMAT=COMPACT效率低;向后兼容
ROW_FORMAT=COMPACT自 MySQL 5.0.3 起的默认存储格式在聚集索引页中存储长字节值的 768 个字节的前缀,其余字节存储在溢出页中
ROW_FORMAT=DYNAMIC每 table 文件 table 空间需要innodb_file_format=Barracuda将值存储在聚集索引页面中(如果适合);如果不是,则仅存储指向溢出页面的 20 字节指针(无前缀)
ROW_FORMAT=COMPRESSED每 table 文件 table 空间需要innodb_file_format=Barracuda使用 zlib 压缩 table 和索引
KEY_BLOCK_SIZE=n每 table 文件 table 空间需要innodb_file_format=Barracuda指定压缩的页面大小为 1、2、4、8 或 16 KB;table 示ROW_FORMAT=COMPRESSED。对于常规 table 空间,不允许KEY_BLOCK_SIZE值等于InnoDB页大小。

table14.7,“在 InnoDB 严格模式为 OFF 时,创建/更改 table 警告和错误”总结了CREATE TABLEALTER TABLE语句上的配置参数和选项的某些组合所发生的错误情况,以及选项在SHOW TABLE STATUS的输出中的显示方式。

innodb_strict_modeOFF时,MySQL 创建或更改 table,但忽略某些设置,如下所示。您可以在 MySQL 错误日志中看到警告消息。当innodb_strict_modeON时,这些指定的选项组合会产生错误,并且不会创建或更改 table。要查看错误条件的完整说明,请发出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) |
+-------+------+-------------------------------------------+

table14.7 InnoDB 严格模式为 OFF 时的创建/更改 table 警告和错误

Syntax警告或错误情况结果ROW_FORMAT,如SHOW TABLE STATUS中所示
ROW_FORMAT=REDUNDANTNoneREDUNDANT
ROW_FORMAT=COMPACTNoneCOMPACT
指定了ROW_FORMAT=COMPRESSEDROW_FORMAT=DYNAMICKEY_BLOCK_SIZE除非同时启用了innodb_file_format =Barracudainnodb_file_per_table,否则忽略每 table 文件 table 空间。常规 table 空间支持所有行格式(有一些限制),而与innodb_file_formatinnodb_file_per_table设置无关。参见第 14.6.3.3 节“常规 table 空间”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_SIZECOMPRESSED
KEY_BLOCK_SIZEREDUNDANTCOMPACTDYNAMIC行格式指定KEY_BLOCK_SIZE被忽略REDUNDANTCOMPACTDYNAMIC
ROW_FORMAT不是REDUNDANTCOMPACTDYNAMICCOMPRESSED之一如果被 MySQL 解析器识别,则将其忽略。否则,将发出错误。默认行格式或不适用

innodb_strict_modeON时,MySQL 拒绝无效的ROW_FORMATKEY_BLOCK_SIZE参数并发出错误。当innodb_strict_modeOFF时,MySQL 会发出警告而不是针对被忽略的无效参数的错误。 innodb_strict_mode默认为ON

innodb_strict_modeON时,MySQL 拒绝无效的ROW_FORMATKEY_BLOCK_SIZE参数。为了与早期版本的 MySQL 兼容,默认情况下不启用严格模式。相反,MySQL 会为忽略的无效参数发出警告(不是错误)。

无法使用SHOW TABLE STATUS查看所选的KEY_BLOCK_SIZE。语句SHOW CREATE TABLE显示KEY_BLOCK_SIZE(即使在创建 table 时已将其忽略)。 MySQL 无法显示 table 的实际压缩页面大小。

常规 table 空间的 SQL 压缩语法警告和错误
  • 如果在创建 table 空间时未为通用 table 空间定义FILE_BLOCK_SIZE,则该 table 空间不能包含压缩 table。如果尝试添加压缩 table,则将返回错误,如以下示例所示:
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的 table 添加到常规 table 空间将返回错误,如以下示例所示:
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

对于常规 table 空间,table 的KEY_BLOCK_SIZE必须等于 table 空间的FILE_BLOCK_SIZE除以 1024.例如,如果 table 空间的FILE_BLOCK_SIZE为 8192,则 table 的KEY_BLOCK_SIZE必须为 8.

  • 尝试将具有未压缩行格式的 table 添加到配置为存储压缩 table 的常规 table 空间中会返回错误,如以下示例所示:
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不适用于常规 table 空间。通用 table 空间的 table 空间 Management 规则严格独立于innodb_strict_mode实施。有关更多信息,请参见第 13.1.19 节“ CREATE TABLESPACE 语句”

有关将压缩 table 与常规 table 空间一起使用的更多信息,请参见第 14.6.3.3 节“常规 table 空间”