SQL压缩语法警告和错误
本节介绍将表压缩功能与每表文件表空间和常规表空间一起使用时可能遇到的语法警告和错误。
每表文件表空间的SQL压缩语法警告和错误
当innodb_strict_mode
被使能(默认值),指定ROW_FORMAT=COMPRESSED
或KEY_BLOCK_SIZE
在CREATE TABLE
或ALTER TABLE
语句如果产生以下错误innodb_file_per_table
被禁止。
ERROR 1031 (HY000): Table storage engine for 't1' doesn't have this option
注意如果当前配置不允许使用压缩表,则不会创建该表。
如果innodb_strict_mode
禁用,则在禁用时在or 语句中指定ROW_FORMAT=COMPRESSED
or 会产生以下警告。KEY_BLOCK_SIZE
CREATE TABLE
ALTER 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
仅当ROW_FORMAT
指定为COMPRESSED
或省略时,才允许该属性。KEY_BLOCK_SIZE
与其他参数一起指定会ROW_FORMAT
生成警告,您可以使用参见SHOW WARNINGS
。但是,该表是未压缩的。指定的内容将KEY_BLOCK_SIZE
被忽略)。
水平 | 码 | 信息 |
---|---|---|
警告 | 1478 | InnoDB: ignoring KEY_BLOCK_SIZE=n unless ROW_FORMAT=COMPRESSED. |
如果正在innodb_strict_mode
启用的情况下运行,则a KEY_BLOCK_SIZE
与ROW_FORMAT
其他任何项的组合都会COMPRESSED
生成错误(不是警告),并且不会创建表。
“ ROW_FORMAT和KEY_BLOCK_SIZE选项”概述了或与一起使用的ROW_FORMAT
和KEY_BLOCK_SIZE
选项。CREATE TABLE
ALTER TABLE
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=n | 指定压缩的页面大小为1、2、4、8或16 KB;暗示ROW_FORMAT=COMPRESSED 。对于常规表空间,不允许使用KEY_BLOCK_SIZE 等于InnoDB 页面大小的值。 |
“关闭InnoDB严格模式时的创建/更改表警告和错误”总结了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; 错误1005(HY000):无法创建表“ test.x”(错误号:1478) mysql> SHOW ERRORS; + ------- + ------ + ---------------------------------- --------- + | 级别| 代码 留言| + ------- + ------ + ---------------------------------- --------- + | 错误 1478 | InnoDB:无效的KEY_BLOCK_SIZE = 33333。| | 错误 1005 | 无法创建表“ test.x”(错误号:1478)| + ------- + ------ + ---------------------------------- --------- +
InnoDB严格模式为OFF时的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 启用,否则忽略每表文件表空间。常规表空间支持所有行格式。请参见“通用表空间”。 | 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
参数问题的错误。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 INTPRIMARY KEY )TABLESPACE ts1ROW_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 = 8192Engine =InnoDB; mysql>CREATE TABLE t2 (c1 INTPRIMARY KEY )TABLESPACE ts2ROW_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 = 8192Engine =InnoDB; mysql>CREATE TABLE t3 (c1 INTPRIMARY KEY )TABLESPACE ts3ROW_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
。有关更多信息,请参见“ CREATE TABLESPACE语句”。
有关将压缩表与常规表空间一起使用的更多信息,请参见“通用表空间”。