本节介绍在对file-per-table 表 空间和通用表空间 使用表压缩功能时可能遇到的语法警告和错误 。
File-Per-Table 表空间的 SQL 压缩语法警告和错误
启用时innodb_strict_mode
(默认),
如果禁用
,指定ROW_FORMAT=COMPRESSED
or
KEY_BLOCK_SIZE
in CREATE
TABLE
orALTER TABLE
语句会产生以下错误
。innodb_file_per_table
ERROR 1031 (HY000): Table storage engine for 't1' doesn't have this option
如果当前配置不允许使用压缩表,则不会创建该表。
禁用时,如果innodb_strict_mode
禁用,指定ROW_FORMAT=COMPRESSED
or
KEY_BLOCK_SIZE
in CREATE
TABLE
orALTER TABLE
语句会产生以下警告
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
时才允许
该属性。与任何其他
指定 a
会生成一条警告,您可以使用 查看。但是,该表未压缩;指定
的被忽略)。
ROW_FORMAT
COMPRESSED
KEY_BLOCK_SIZE
ROW_FORMAT
SHOW WARNINGS
KEY_BLOCK_SIZE
等级 | 代码 | 信息 |
---|---|---|
警告 | 1478 | InnoDB: ignoring KEY_BLOCK_SIZE= |
如果您在
innodb_strict_mode
启用的情况下运行,则 aKEY_BLOCK_SIZE
与除任何
ROW_FORMAT
以外
的组合会COMPRESSED
生成错误,而不是警告,并且不会创建表。
表 15.12,“ROW_FORMAT 和 KEY_BLOCK_SIZE 选项”
概述了与或
一起使用
的ROW_FORMAT
和
选项。
KEY_BLOCK_SIZE
CREATE TABLE
ALTER TABLE
表 15.12 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 KB 的压缩页面大小;暗示
ROW_FORMAT=COMPRESSED . 对于一般表空间,不允许使用KEY_BLOCK_SIZE 等于页面大小的值。InnoDB |
表 15.13,“InnoDB 严格模式关闭时的 CREATE/ALTER TABLE 警告和错误”CREATE TABLE
总结了or
语句
上配置参数和选项的某些组合发生的错误情况,
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): 无法创建表 'test.x' (errno: 1478) 数据库>SHOW ERRORS;
+--------+------+-------------------------------- ----------+ | 级别 | 代码 | 留言 | +--------+------+-------------------------------- ----------+ | 错误 | 第 1478 章 InnoDB:无效的 KEY_BLOCK_SIZE=33333。| | 错误 | 1005 | 无法创建表“test.x”(错误号:1478)| +--------+------+-------------------------------- ----------+
表 15.13 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 除非启用,否则忽略每个表文件表空间
。通用表空间支持所有行格式。请参阅
第 15.6.3.3 节,“通用表空间”。 |
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 解析器识别则忽略。否则,将发出错误。 | 默认行格式或 N/A |
时innodb_strict_mode
,
ON
MySQL 拒绝无效
ROW_FORMAT
或
KEY_BLOCK_SIZE
参数并发出错误。严格模式是ON
默认的。当
innodb_strict_mode
是时OFF
,MySQL 会发出警告而不是针对忽略的无效参数的错误。
KEY_BLOCK_SIZE
使用
无法查看所选内容
SHOW TABLE
STATUS
。该语句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
. 有关详细信息,请参阅第 13.1.21 节,“CREATE TABLESPACE 语句”。
有关将压缩表与通用表空间一起使用的更多信息,请参阅第 15.6.3.3 节,“通用表空间”。