本节介绍在对file-per-table 表 空间和通用表空间 使用表压缩功能时可能遇到的语法警告和错误 。
File-Per-Table 表空间的 SQL 压缩语法警告和错误
启用时innodb_strict_mode
(默认),指定
ROW_FORMAT=COMPRESSED
or
KEY_BLOCK_SIZE
in CREATE
TABLE
or语句会在禁用或
设置为
而不是
ALTER TABLE
时产生以下错误
。
innodb_file_per_table
innodb_file_format
Antelope
Barracuda
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. |
+---------+------+---------------------------------------------------------------+
innodb_file_format
如果设置为
Antelope
而不是
,
则会发出类似的警告
Barracuda
。
这些消息只是警告,不是错误,而且表是在没有压缩的情况下创建的,就好像没有指定选项一样。
“非严格”行为允许您将
mysqldump
文件导入不支持压缩表的数据库,即使源数据库包含压缩表。在这种情况下,MySQL 会创建表
ROW_FORMAT=COMPACT
而不是阻止操作。
要将转储文件导入新数据库,并重新创建原始数据库中存在的表,请确保服务器具有正确的配置参数设置
innodb_file_format
和
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
生成错误,而不是警告,并且不会创建表。
表 14.6,“ROW_FORMAT 和 KEY_BLOCK_SIZE 选项”
概述了与或
一起使用
的ROW_FORMAT
和
选项。
KEY_BLOCK_SIZE
CREATE TABLE
ALTER TABLE
表 14.6 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 |
File-per-table 表空间需要
innodb_file_format=Barracuda |
如果适合,则将值存储在聚簇索引页中;如果不是,则仅存储指向溢出页的 20 字节指针(无前缀) |
ROW_FORMAT=COMPRESSED |
File-per-table 表空间需要
innodb_file_format=Barracuda |
使用 zlib 压缩表和索引 |
KEY_BLOCK_SIZE= |
File-per-table 表空间需要
innodb_file_format=Barracuda |
指定 1、2、4、8 或 16 KB 的压缩页面大小;暗示
ROW_FORMAT=COMPRESSED . 对于一般表空间,不允许使用KEY_BLOCK_SIZE 等于页面大小的值。InnoDB |
表 14.7,“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)| +--------+------+-------------------------------- ----------+
表 14.7 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 指定 |
对于 file-per-table 表空间忽略,除非同时
启用
和。通用表空间支持所有行格式(有一些限制) ,
无论
设置如何。请参阅第 14.6.3.3 节,“通用表空间”。innodb_file_format =Barracuda innodb_file_per_table innodb_file_format innodb_file_per_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 解析器识别则忽略。否则,将发出错误。 | 默认行格式或 N/A |
时innodb_strict_mode
,
ON
MySQL 拒绝无效
ROW_FORMAT
或
KEY_BLOCK_SIZE
参数并发出错误。当innodb_strict_mode
是
时OFF
,MySQL 会发出警告而不是针对忽略的无效参数的错误。
默认情况下
innodb_strict_mode
。ON
When innodb_strict_mode
is
ON
, MySQL rejects invalid
ROW_FORMAT
or
KEY_BLOCK_SIZE
parameters. For compatibility
with earlier versions of MySQL, strict mode is not enabled by
default; instead, MySQL issues warnings (not errors) for ignored
invalid parameters.
It is not possible to see the chosen
KEY_BLOCK_SIZE
using SHOW TABLE
STATUS
. The statement SHOW CREATE
TABLE
displays the KEY_BLOCK_SIZE
(even if it was ignored when creating the table). The real
compressed page size of the table cannot be displayed by MySQL.
SQL Compression Syntax Warnings and Errors for General Tablespaces
If
FILE_BLOCK_SIZE
was not defined for the general tablespace when the tablespace was created, the tablespace cannot contain compressed tables. If you attempt to add a compressed table, an error is returned, as shown in the following example: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
Attempting to add a table with an invalid
KEY_BLOCK_SIZE
to a general tablespace returns an error, as shown in the following example: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
For general tablespaces, the
KEY_BLOCK_SIZE
of the table must be equal to theFILE_BLOCK_SIZE
of the tablespace divided by 1024. For example, if theFILE_BLOCK_SIZE
of the tablespace is 8192, theKEY_BLOCK_SIZE
of the table must be 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.19 节,“CREATE TABLESPACE 语句”。
有关将压缩表与通用表空间一起使用的更多信息,请参阅第 14.6.3.3 节,“通用表空间”。