Documentation Home

15.9.1.7 SQL 压缩语法警告和错误

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

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

启用时innodb_strict_mode(默认), 如果禁用 ,指定ROW_FORMAT=COMPRESSEDor KEY_BLOCK_SIZEin CREATE TABLEorALTER TABLE 语句会产生以下错误 。innodb_file_per_table

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

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

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

要将转储文件导入新数据库,并重新创建原始数据库中存在的表,请确保服务器具有正确的 innodb_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生成错误,而不是警告,并且不会创建表。

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

表 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. 对于一般表空间,不允许使用KEY_BLOCK_SIZE等于页面大小的值。InnoDB

表 15.13,“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)|
+--------+------+-------------------------------- ----------+

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

句法 警告或错误情况 结果ROW_FORMAT,如图SHOW TABLE STATUS
ROW_FORMAT=REDUNDANT 没有任何 REDUNDANT
ROW_FORMAT=COMPACT 没有任何 COMPACT
ROW_FORMAT=COMPRESSEDROW_FORMAT=DYNAMICKEY_BLOCK_SIZE指定 innodb_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=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参数并发出错误。严格模式是ON默认的。当 innodb_strict_mode是时OFF,MySQL 会发出警告而不是针对忽略的无效参数的错误。

KEY_BLOCK_SIZE使用 无法查看所选内容 SHOW TABLE STATUS。该语句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 节,“通用表空间”