Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  SQL Compression Syntax Warnings and Errors

17.9.1.7 SQL 压缩语法警告和错误

本节描述了在使用文件每表表空间和通用表空间时可能遇到的语法警告和错误。

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

innodb_strict_mode 启用(默认)时,在 CREATE TABLEALTER TABLE 语句中指定 ROW_FORMAT=COMPRESSEDKEY_BLOCK_SIZE 将产生以下错误,如果 innodb_file_per_table 禁用。

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

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

innodb_strict_mode 禁用时,在 CREATE TABLEALTER TABLE 语句中指定 ROW_FORMAT=COMPRESSEDKEY_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.                          |
+---------+------+---------------------------------------------------------------+
Note

这些消息只是警告,而不是错误,表将被创建,而不使用压缩选项。

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

要将转储文件导入到新数据库,并重新创建表以与原始数据库相同的方式,请确保服务器具有正确的 innodb_file_per_table 配置参数。

属性 KEY_BLOCK_SIZE 只允许与 ROW_FORMAT 指定为 COMPRESSED 或省略时使用。指定 KEY_BLOCK_SIZE 与任何其他 ROW_FORMAT 将生成警告,可以使用 SHOW WARNINGS 查看。然而,表将不是压缩的;指定的 KEY_BLOCK_SIZE 将被忽略。

Level Code Message
Warning 1478 InnoDB: ignoring KEY_BLOCK_SIZE=n unless ROW_FORMAT=COMPRESSED.

如果您正在使用 innodb_strict_mode 启用,组合 KEY_BLOCK_SIZE 与任何 ROW_FORMAT 除了 COMPRESSED 将生成错误,而不是警告,表将不会被创建。

表 17.12,“ROW_FORMAT 和 KEY_BLOCK_SIZE 选项” 提供了使用 CREATE TABLEALTER TABLEROW_FORMATKEY_BLOCK_SIZE 选项的概述。

表 17.12 ROW_FORMAT 和 KEY_BLOCK_SIZE 选项

Option Usage Notes Description
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 千字节;隐含 ROW_FORMAT=COMPRESSED。对于通用表空间,KEY_BLOCK_SIZE 值等于 InnoDB 页大小是不允许的。

表 17.13,“CREATE/ALTER TABLE 警告和错误当 InnoDB 严格模式关闭” 总结了在某些配置参数和选项组合下出现的错误条件,以及这些选项在 CREATE TABLEALTER 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) |
+-------+------+-------------------------------------------+

表 17.13 CREATE/ALTER TABLE 警告和错误当 InnoDB 严格模式关闭

Syntax Warning or Error Condition Resulting ROW_FORMAT, as shown in SHOW TABLE STATUS
ROW_FORMAT=REDUNDANT REDUNDANT
ROW_FORMAT=COMPACT COMPACT
ROW_FORMAT=COMPRESSED or ROW_FORMAT=DYNAMIC or KEY_BLOCK_SIZE is specified 如果 innodb_file_per_table 未启用,则忽略文件每表表空间中的 COMPACT。通用表空间支持所有行格式。请参阅 第 17.6.3.3 节,“通用表空间” 文件每表表空间的默认行格式;通用表空间的指定行格式
Invalid KEY_BLOCK_SIZE is specified (not 1, 2, 4, 8 or 16) KEY_BLOCK_SIZE 被忽略 指定的行格式,或者默认行格式
ROW_FORMAT=COMPRESSED and valid KEY_BLOCK_SIZE are specified 无;KEY_BLOCK_SIZE 指定的值被使用 COMPRESSED
KEY_BLOCK_SIZE is specified with REDUNDANT, COMPACT or DYNAMIC row format KEY_BLOCK_SIZE 被忽略 REDUNDANTCOMPACTDYNAMIC
ROW_FORMAT is not one of REDUNDANT, COMPACT, DYNAMIC or COMPRESSED 如果 MySQL 解析器识别,则忽略。否则,发出错误。 默认行格式或 N/A

innodb_strict_modeON 时,MySQL 拒绝无效的 ROW_FORMATKEY_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。有关更多信息,请参阅 第 15.1.21 节,“CREATE TABLESPACE 语句”

有关使用通用表空间中的压缩表的更多信息,请参阅第 17.6.3.3 节,“通用表空间”