本节描述了在使用文件每表表空间和通用表空间时可能遇到的语法警告和错误。
文件每表表空间的 SQL 压缩语法警告和错误
当 innodb_strict_mode
启用(默认)时,在 CREATE TABLE
或 ALTER TABLE
语句中指定 ROW_FORMAT=COMPRESSED
或 KEY_BLOCK_SIZE
将产生以下错误,如果 innodb_file_per_table
禁用。
ERROR 1031 (HY000): Table storage engine for 't1' doesn't have this option
如果当前配置不允许使用压缩表,则表不会被创建。
当 innodb_strict_mode
禁用时,在 CREATE TABLE
或 ALTER TABLE
语句中指定 ROW_FORMAT=COMPRESSED
或 KEY_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. |
+---------+------+---------------------------------------------------------------+
这些消息只是警告,而不是错误,表将被创建,而不使用压缩选项。
这种“非严格”行为允许您将 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= |
如果您正在使用 innodb_strict_mode
启用,组合 KEY_BLOCK_SIZE
与任何 ROW_FORMAT
除了 COMPRESSED
将生成错误,而不是警告,表将不会被创建。
表 17.12,“ROW_FORMAT 和 KEY_BLOCK_SIZE 选项” 提供了使用 CREATE TABLE
或 ALTER TABLE
的 ROW_FORMAT
和 KEY_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= |
指定压缩页面大小为 1、2、4、8 或 16 千字节;隐含 ROW_FORMAT=COMPRESSED 。对于通用表空间,KEY_BLOCK_SIZE 值等于 InnoDB 页大小是不允许的。 |
表 17.13,“CREATE/ALTER TABLE 警告和错误当 InnoDB 严格模式关闭” 总结了在某些配置参数和选项组合下出现的错误条件,以及这些选项在 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.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 被忽略 |
REDUNDANT 、COMPACT 或 DYNAMIC |
ROW_FORMAT is not one of REDUNDANT , COMPACT , DYNAMIC or 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 节,“通用表空间”。