文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  SQL 压缩语法警告和错误

17.9.1.7 SQL 压缩语法警告和错误

本节介绍使用表压缩功能时可能遇到的语法警告和错误,以及 每个表一个文件 表空间和 通用表空间.

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

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

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

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

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

这些消息只是警告,而不是错误,并且表将创建但不会压缩,就像没有指定这些选项一样。

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

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

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

级别 代码 消息
警告 1478 InnoDB: 忽略 KEY_BLOCK_SIZE=n,除非 ROW_FORMAT=COMPRESSED。

如果使用启用了 innodb_strict_mode 的方式运行,则 KEY_BLOCK_SIZE 与除 COMPRESSED 之外的任何 ROW_FORMAT 的组合会生成错误,而不是警告,并且不会创建表。

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

表 17.11 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 千字节的压缩页面大小;意味着 ROW_FORMAT=COMPRESSED。对于通用表空间,KEY_BLOCK_SIZE 值不能等于 InnoDB 页面大小。

表 17.12,“当 InnoDB 严格模式关闭时,CREATE/ALTER TABLE 警告和错误” 总结了在 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.12 当 InnoDB 严格模式关闭时,CREATE/ALTER TABLE 警告和错误

语法 警告或错误条件 SHOW TABLE STATUS 中显示的最终 ROW_FORMAT
ROW_FORMAT=REDUNDANT REDUNDANT
ROW_FORMAT=COMPACT COMPACT
ROW_FORMAT=COMPRESSEDROW_FORMAT=DYNAMIC 或 指定了 KEY_BLOCK_SIZE 除非启用了 innodb_file_per_table,否则对于每个文件表空间都会被忽略。通用表空间支持所有行格式。请参阅 第 17.6.3.3 节,“通用表空间” 每个文件表空间的默认行格式;通用表空间的指定行格式
指定了无效的 KEY_BLOCK_SIZE(不是 1、2、4、8 或 16) 忽略 KEY_BLOCK_SIZE 指定的行格式,或默认行格式
指定了 ROW_FORMAT=COMPRESSED 和有效的 KEY_BLOCK_SIZE 无;使用指定的 KEY_BLOCK_SIZE COMPRESSED
使用 REDUNDANTCOMPACTDYNAMIC 行格式指定了 KEY_BLOCK_SIZE 忽略 KEY_BLOCK_SIZE REDUNDANTCOMPACTDYNAMIC
ROW_FORMAT 不是 REDUNDANTCOMPACTDYNAMICCOMPRESSED 之一 如果被 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 节,“通用表空间”