17.9.1.7 SQL 压缩语法警告和错误
本节描述了使用文件表空间和通用表空间时可能遇到的表压缩特性语法警告和错误。
SQL Compression Syntax Warnings and Errors for File-Per-Table 表paces
当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. |
+---------+------+---------------------------------------------------------------+
这些消息只是警告,而不是错误,表将被创建为未压缩的状态,就像没有指定选项一样。
“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= |
如果您启用了 innodb_strict_mode
,则 KEY_BLOCK_IZE 和任何 ROW_FORMAT 都不是 COMPRESSED 将生成错误,而不是警告,并且表将不会被创建。
17.11,“ROW_ FORMAT 和 KEY_ BLOCK_ SIZE 选项”提供了关于ROW_ FORMAT
和KEY_ BLOCK_ SIZE
选项的概述,这些选项用于CREATE TABLE
或ALTER 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= |
指定压缩页面大小为 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 被忽略 |
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 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”。