14.9.1.7 SQL 压缩语法警告和错误
本节介绍将 table 压缩功能与file-per-tabletable 空间和general tablespaces一起使用时可能遇到的语法警告和错误。
每 table 文件 table 空间的 SQL 压缩语法警告和错误
启用innodb_strict_mode时(默认设置),如果禁用innodb_file_per_table或将innodb_file_format设置为Antelope
而不是Barracuda
,则在CREATE TABLE或ALTER TABLE语句中指定ROW_FORMAT=COMPRESSED
或KEY_BLOCK_SIZE
会产生以下错误。
ERROR 1031 (HY000): Table storage engine for 't1' doesn't have this option
Note
如果当前配置不允许使用压缩 table,则不会创建该 table。
禁用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. |
+---------+------+---------------------------------------------------------------+
如果将innodb_file_format设置为Antelope
而不是Barracuda
,则会发出类似的警告。
Note
这些消息仅是警告,不是错误,并且创建 table 时没有进行压缩,就像未指定选项一样。
通过“非严格”行为,即使源数据库包含压缩 table,也可以将mysqldump
文件导入不支持压缩 table 的数据库中。在这种情况下,MySQL 会在ROW_FORMAT=COMPACT
中创建 table,而不是阻止该操作。
要将转储文件导入到新数据库中,并重新创建原始数据库中存在的 table,请确保服务器对配置参数innodb_file_format和innodb_file_per_table进行了正确的设置。
仅当将ROW_FORMAT
指定为COMPRESSED
或将其省略时,才允许属性KEY_BLOCK_SIZE
。与其他ROW_FORMAT
一起指定KEY_BLOCK_SIZE
会生成警告,您可以使用SHOW WARNINGS
查看。但是,该 table 是未压缩的。指定的KEY_BLOCK_SIZE
被忽略)。
Level | Code | Message |
---|---|---|
Warning | 1478 | InnoDB: ignoring KEY_BLOCK_SIZE=n unless ROW_FORMAT=COMPRESSED. |
如果在启用innodb_strict_mode的情况下运行,则KEY_BLOCK_SIZE
与COMPRESSED
以外的任何ROW_FORMAT
的组合会生成错误(不是警告),并且不会创建 table。
table14.6,“ ROW_FORMAT 和 KEY_BLOCK_SIZE 选项”概述了与CREATE TABLE或ALTER TABLE一起使用的ROW_FORMAT
和KEY_BLOCK_SIZE
选项。
table14.6 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 |
每 table 文件 table 空间需要innodb_file_format=Barracuda |
将值存储在聚集索引页面中(如果适合);如果不是,则仅存储指向溢出页面的 20 字节指针(无前缀) |
ROW_FORMAT=COMPRESSED |
每 table 文件 table 空间需要innodb_file_format=Barracuda |
使用 zlib 压缩 table 和索引 |
KEY_BLOCK_SIZE=n |
每 table 文件 table 空间需要innodb_file_format=Barracuda |
指定压缩的页面大小为 1、2、4、8 或 16 KB;table 示ROW_FORMAT=COMPRESSED 。对于常规 table 空间,不允许KEY_BLOCK_SIZE 值等于InnoDB 页大小。 |
table14.7,“在 InnoDB 严格模式为 OFF 时,创建/更改 table 警告和错误”总结了CREATE TABLE或ALTER TABLE语句上的配置参数和选项的某些组合所发生的错误情况,以及选项在SHOW TABLE STATUS
的输出中的显示方式。
当innodb_strict_mode为OFF
时,MySQL 创建或更改 table,但忽略某些设置,如下所示。您可以在 MySQL 错误日志中看到警告消息。当innodb_strict_mode为ON
时,这些指定的选项组合会产生错误,并且不会创建或更改 table。要查看错误条件的完整说明,请发出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) |
+-------+------+-------------------------------------------+
table14.7 InnoDB 严格模式为 OFF 时的创建/更改 table 警告和错误
Syntax | 警告或错误情况 | 结果ROW_FORMAT ,如SHOW TABLE STATUS 中所示 |
---|---|---|
ROW_FORMAT=REDUNDANT |
None | REDUNDANT |
ROW_FORMAT=COMPACT |
None | COMPACT |
指定了ROW_FORMAT=COMPRESSED 或ROW_FORMAT=DYNAMIC 或KEY_BLOCK_SIZE |
除非同时启用了innodb_file_format =Barracuda 和innodb_file_per_table,否则忽略每 table 文件 table 空间。常规 table 空间支持所有行格式(有一些限制),而与innodb_file_format和innodb_file_per_table设置无关。参见第 14.6.3.3 节“常规 table 空间”。 |
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=COMPRESSED 和有效的KEY_BLOCK_SIZE |
没有;已使用指定的KEY_BLOCK_SIZE |
COMPRESSED |
KEY_BLOCK_SIZE 以REDUNDANT ,COMPACT 或DYNAMIC 行格式指定 |
KEY_BLOCK_SIZE 被忽略 |
REDUNDANT ,COMPACT 或DYNAMIC |
ROW_FORMAT 不是REDUNDANT ,COMPACT ,DYNAMIC 或COMPRESSED 之一 |
如果被 MySQL 解析器识别,则将其忽略。否则,将发出错误。 | 默认行格式或不适用 |
当innodb_strict_mode
为ON
时,MySQL 拒绝无效的ROW_FORMAT
或KEY_BLOCK_SIZE
参数并发出错误。当innodb_strict_mode
为OFF
时,MySQL 会发出警告而不是针对被忽略的无效参数的错误。 innodb_strict_mode
默认为ON
。
当innodb_strict_mode
为ON
时,MySQL 拒绝无效的ROW_FORMAT
或KEY_BLOCK_SIZE
参数。为了与早期版本的 MySQL 兼容,默认情况下不启用严格模式。相反,MySQL 会为忽略的无效参数发出警告(不是错误)。
无法使用SHOW TABLE STATUS
查看所选的KEY_BLOCK_SIZE
。语句SHOW CREATE TABLE
显示KEY_BLOCK_SIZE
(即使在创建 table 时已将其忽略)。 MySQL 无法显示 table 的实际压缩页面大小。
常规 table 空间的 SQL 压缩语法警告和错误
- 如果在创建 table 空间时未为通用 table 空间定义
FILE_BLOCK_SIZE
,则该 table 空间不能包含压缩 table。如果尝试添加压缩 table,则将返回错误,如以下示例所示:
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
的 table 添加到常规 table 空间将返回错误,如以下示例所示:
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
对于常规 table 空间,table 的KEY_BLOCK_SIZE
必须等于 table 空间的FILE_BLOCK_SIZE
除以 1024.例如,如果 table 空间的FILE_BLOCK_SIZE
为 8192,则 table 的KEY_BLOCK_SIZE
必须为 8.
- 尝试将具有未压缩行格式的 table 添加到配置为存储压缩 table 的常规 table 空间中会返回错误,如以下示例所示:
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不适用于常规 table 空间。通用 table 空间的 table 空间 Management 规则严格独立于innodb_strict_mode实施。有关更多信息,请参见第 13.1.19 节“ CREATE TABLESPACE 语句”。
有关将压缩 table 与常规 table 空间一起使用的更多信息,请参见第 14.6.3.3 节“常规 table 空间”。