Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

17.9.1.7 SQL 压缩语法警告和错误

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

SQL Compression Syntax Warnings and Errors for File-Per-Table 表paces

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

这些消息只是警告,而不是错误,表将被创建为未压缩的状态,就像没有指定选项一样。

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

要将 dump 文件导入到新数据库,并将表重新创建为原始数据库中的状态,请确保服务器具有正确的设置 для innodb_file_per_table 配置参数。

属性 KEY_BLOCK_SIZE 只能在 ROW_FORMAT 指定为 COMPRESSED 或省略时被允许。指定任何其他 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_IZE 和任何 ROW_FORMAT 都不是 COMPRESSED 将生成错误,而不是警告,并且表将不会被创建。

17.11,“ROW_ FORMAT 和 KEY_ BLOCK_ SIZE 选项”提供了关于ROW_ FORMATKEY_ BLOCK_ SIZE选项的概述,这些选项用于CREATE TABLEALTER TABLE

17.11 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.12,“CREATE/ALTER TABLE Warnings and Errors when InnoDB Strict Mode is OFF”总结了在InnoDB严格模式关闭时,某些配置参数和选项组合下可能出现的错误情况,以及这些选项在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): 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.12 CREATE/ALTER TABLE Warnings and Errors when InnoDB Strict Mode is OFF

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,否则对文件表空间无效。一般表空间支持所有行格式。请参阅第17.6.3.3节,“General Tablespaces” 文件表空间的默认行格式;一般表空间的指定行格式
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 Compression Syntax Warnings and Errors for General 表paces
  • 如果在创建通用表空间时未定义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 Statement”

关于使用压缩表与通用表空间的更多信息,请见第17.6.3.3节,“General Tablespaces”