本节介绍在使用表压缩功能与 每表文件 表空间和 通用表空间 时,您可能会遇到的语法警告和错误。
每表文件表空间的 SQL 压缩语法警告和错误
当 innodb_strict_mode
启用(默认值)时,如果 innodb_file_per_table
已禁用,则在 CREATE TABLE
或 ALTER TABLE
语句中指定 ROW_FORMAT=COMPRESSED
或 KEY_BLOCK_SIZE
会产生以下错误。
ERROR 1031 (HY000): Table storage engine for 't1' doesn't have this option
如果当前配置不允许使用压缩表,则不会创建表。
当 innodb_strict_mode
禁用时,如果 innodb_file_per_table
已禁用,则在 CREATE TABLE
或 ALTER TABLE
语句中指定 ROW_FORMAT=COMPRESSED
或 KEY_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= |
如果您使用 innodb_strict_mode
启用运行,则 KEY_BLOCK_SIZE
与除 COMPRESSED
以外的任何 ROW_FORMAT
结合使用会生成错误,而不是警告,并且不会创建表。
表 17.11,“ROW_FORMAT 和 KEY_BLOCK_SIZE 选项” 提供了与 CREATE TABLE
或 ALTER TABLE
一起使用的 ROW_FORMAT
和 KEY_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= |
指定 1、2、4、8 或 16 千字节的压缩页面大小;隐含 ROW_FORMAT=COMPRESSED 。对于通用表空间,不允许 KEY_BLOCK_SIZE 值等于 InnoDB 页面大小。 |
表 17.12,“当 InnoDB 严格模式关闭时,CREATE/ALTER TABLE 警告和错误” 总结了在 CREATE TABLE
或 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): 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 警告和错误
语法 | 警告或错误条件 | 结果 ROW_FORMAT ,如 SHOW TABLE STATUS 中所示 |
---|---|---|
ROW_FORMAT=REDUNDANT |
无 | REDUNDANT |
ROW_FORMAT=COMPACT |
无 | COMPACT |
ROW_FORMAT=COMPRESSED 或 ROW_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 |
使用 REDUNDANT 、COMPACT 或 DYNAMIC 行格式指定 KEY_BLOCK_SIZE |
KEY_BLOCK_SIZE 被忽略 |
REDUNDANT 、COMPACT 或 DYNAMIC |
ROW_FORMAT 不是 REDUNDANT 、COMPACT 、DYNAMIC 或 COMPRESSED 之一 |
如果被 MySQL 解析器识别,则被忽略。否则,会发出错误。 | 默认行格式或 N/A |
当 innodb_strict_mode
为 ON
时,MySQL 会拒绝无效的 ROW_FORMAT
或 KEY_BLOCK_SIZE
参数并发出错误。严格模式默认情况下为 ON
。当 innodb_strict_mode
为 OFF
时,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 节,"通用表空间"。