Documentation Home

14.9.1.7 SQL 压缩语法警告和错误

本节介绍在对file-per-table 表 空间和通用表空间 使用表压缩功能时可能遇到的语法警告和错误 。

File-Per-Table 表空间的 SQL 压缩语法警告和错误

启用时innodb_strict_mode(默认),指定 ROW_FORMAT=COMPRESSEDor KEY_BLOCK_SIZEin CREATE TABLEor语句会在禁用或 设置为 而不是 ALTER TABLE 时产生以下错误 。 innodb_file_per_tableinnodb_file_formatAntelopeBarracuda

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

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

禁用时,如果innodb_strict_mode禁用,指定ROW_FORMAT=COMPRESSEDor KEY_BLOCK_SIZEin CREATE TABLEorALTER TABLE 语句会产生以下警告 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.                          |
+---------+------+---------------------------------------------------------------+

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

笔记

这些消息只是警告,不是错误,而且表是在没有压缩的情况下创建的,就好像没有指定选项一样。

非严格”行为允许您将 mysqldump文件导入不支持压缩表的数据库,即使源数据库包含压缩表。在这种情况下,MySQL 会创建表 ROW_FORMAT=COMPACT而不是阻止操作。

要将转储文件导入新数据库,并重新创建原始数据库中存在的表,请确保服务器具有正确的配置参数设置 innodb_file_formatinnodb_file_per_table.

仅当指定为 或省略KEY_BLOCK_SIZE时才允许 该属性。与任何其他 指定 a 会生成一条警告,您可以使用 查看。但是,该表未压缩;指定 的被忽略)。 ROW_FORMATCOMPRESSEDKEY_BLOCK_SIZEROW_FORMATSHOW WARNINGSKEY_BLOCK_SIZE

等级 代码 信息
警告 1478 InnoDB: ignoring KEY_BLOCK_SIZE=n unless ROW_FORMAT=COMPRESSED.

如果您在 innodb_strict_mode启用的情况下运行,则 aKEY_BLOCK_SIZE与除任何 ROW_FORMAT以外 的组合会COMPRESSED生成错误,而不是警告,并且不会创建表。

表 14.6,“ROW_FORMAT 和 KEY_BLOCK_SIZE 选项” 概述了与或 一起使用 的ROW_FORMAT和 选项。 KEY_BLOCK_SIZECREATE TABLEALTER TABLE

表 14.6 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 File-per-table 表空间需要 innodb_file​_format=Barracuda 如果适合,则将值存储在聚簇索引页中;如果不是,则仅存储指向溢出页的 20 字节指针(无前缀)
ROW_FORMAT=​COMPRESSED File-per-table 表空间需要 innodb_file​_format=Barracuda 使用 zlib 压缩表和索引
KEY_BLOCK_​SIZE=n File-per-table 表空间需要 innodb_file​_format=Barracuda 指定 1、2、4、8 或 16 KB 的压缩页面大小;暗示 ROW_FORMAT=COMPRESSED. 对于一般表空间,不允许使用KEY_BLOCK_SIZE等于页面大小的值。InnoDB

表 14.7,“InnoDB 严格模式关闭时的 CREATE/ALTER TABLE 警告和错误”CREATE TABLE总结了or 语句 上配置参数和选项的某些组合发生的错误情况, 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): 无法创建表 'test.x' (errno: 1478)

数据库>SHOW ERRORS;
+--------+------+-------------------------------- ----------+
| 级别 | 代码 | 留言 |
+--------+------+-------------------------------- ----------+
| 错误 | 第 1478 章 InnoDB:无效的 KEY_BLOCK_SIZE=33333。|
| 错误 | 1005 | 无法创建表“test.x”(错误号:1478)|
+--------+------+-------------------------------- ----------+

表 14.7 InnoDB 严格模式关闭时的 CREATE/ALTER TABLE 警告和错误

句法 警告或错误情况 结果ROW_FORMAT,如图SHOW TABLE STATUS
ROW_FORMAT=REDUNDANT 没有任何 REDUNDANT
ROW_FORMAT=COMPACT 没有任何 COMPACT
ROW_FORMAT=COMPRESSEDROW_FORMAT=DYNAMICKEY_BLOCK_SIZE指定 对于 file-per-table 表空间忽略,除非同时 启用 和。通用表空间支持所有行格式(有一些限制) , 无论 设置如何。请参阅第 14.6.3.3 节,“通用表空间”innodb_file_format=Barracudainnodb_file_per_tableinnodb_file_formatinnodb_file_per_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=COMPRESSEDKEY_BLOCK_SIZE指定有效 没有任何; KEY_BLOCK_SIZE指定被使用 COMPRESSED
KEY_BLOCK_SIZE指定为 REDUNDANT,COMPACTDYNAMIC行格式 KEY_BLOCK_SIZE被忽略 REDUNDANT,COMPACT或者 DYNAMIC
ROW_FORMAT不是 REDUNDANT, COMPACT, DYNAMICCOMPRESSED 如果被 MySQL 解析器识别则忽略。否则,将发出错误。 默认行格式或 N/A

innodb_strict_modeONMySQL 拒绝无效 ROW_FORMATKEY_BLOCK_SIZE参数并发出错误。当innodb_strict_mode是 时OFF,MySQL 会发出警告而不是针对忽略的无效参数的错误。 默认情况下 innodb_strict_modeON

When innodb_strict_mode is ON, MySQL rejects invalid ROW_FORMAT or KEY_BLOCK_SIZE parameters. For compatibility with earlier versions of MySQL, strict mode is not enabled by default; instead, MySQL issues warnings (not errors) for ignored invalid parameters.

It is not possible to see the chosen KEY_BLOCK_SIZE using SHOW TABLE STATUS. The statement SHOW CREATE TABLE displays the KEY_BLOCK_SIZE (even if it was ignored when creating the table). The real compressed page size of the table cannot be displayed by MySQL.

SQL Compression Syntax Warnings and Errors for General Tablespaces
  • If FILE_BLOCK_SIZE was not defined for the general tablespace when the tablespace was created, the tablespace cannot contain compressed tables. If you attempt to add a compressed table, an error is returned, as shown in the following example:

    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
  • Attempting to add a table with an invalid KEY_BLOCK_SIZE to a general tablespace returns an error, as shown in the following example:

    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

    For general tablespaces, the KEY_BLOCK_SIZE of the table must be equal to the FILE_BLOCK_SIZE of the tablespace divided by 1024. For example, if the FILE_BLOCK_SIZE of the tablespace is 8192, the KEY_BLOCK_SIZE of the table must be 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.19 节,“CREATE TABLESPACE 语句”

有关将压缩表与通用表空间一起使用的更多信息,请参阅第 14.6.3.3 节,“通用表空间”