本节描述在使用表压缩特性时可能遇到的语法警告和错误file-per-table表空间和一般的表空间.
逐表文件表空间的SQL压缩语法警告和错误
当innodb_strict_mode
启用(默认值),指定ROW_FORMAT =压缩
或KEY_BLOCK_SIZE
在创建表
或ALTER TABLE
语句产生以下错误,如果innodb_file_per_table
是禁用的。
错误1031 (HY000):表存储引擎't1'没有这个选项
如果当前配置不允许使用压缩表,则不会创建该表。
当innodb_strict_mode
禁用时,指定ROW_FORMAT =压缩
或KEY_BLOCK_SIZE
在创建表
或ALTER TABLE
语句产生以下警告,如果innodb_file_per_table
是禁用的。
mysql>显示警告;+---------+------+---------------------------------------------------------------+ | 水平| |消息代码 | +---------+------+---------------------------------------------------------------+ | 警告| 1478 | InnoDB: KEY_BLOCK_SIZE需要innodb_file_per_table。| |警告| 1478 | InnoDB: ignore KEY_BLOCK_SIZE=4。| |警告| 1478 | InnoDB: ROW_FORMAT=COMPRESSED需要innodb_file_per_table。| |警告| 1478 | InnoDB:假设ROW_FORMAT=DYNAMIC。| +---------+------+---------------------------------------------------------------+
这些消息只是警告,而不是错误,并且创建表时没有压缩,就好像没有指定选项一样。
的”的非严格”行为允许您导入, mysqldump
文件导入到不支持压缩表的数据库中,即使源数据库包含压缩表。在这种情况下,MySQL将在ROW_FORMAT =动态
而不是阻止手术。
要将转储文件导入到新数据库中,并按照原始数据库中的表重新创建表,请确保服务器对innodb_file_per_table
配置参数。
属性KEY_BLOCK_SIZE
仅当ROW_FORMAT
指定为压缩
或被省略。指定一个KEY_BLOCK_SIZE
与任何其他ROW_FORMAT
生成一个可以查看的警告显示警告
.但是,表是未压缩的;指定的KEY_BLOCK_SIZE
被忽略)。
水平 | 代码 | 消息 |
---|---|---|
警告 | 1478 | InnoDB:忽略KEY_BLOCK_SIZE= |
如果你在跑步innodb_strict_mode
启用时,a的组合KEY_BLOCK_SIZE
与任何ROW_FORMAT
除了压缩
生成错误,而不是警告,并且不会创建表。
表15.12,“ROW_FORMAT和KEY_BLOCK_SIZE选项”提供ROW_FORMAT
而且KEY_BLOCK_SIZE
使用的选项创建表
或ALTER TABLE
.
表15.12 ROW_FORMAT和KEY_BLOCK_SIZE选项
选项 | 使用笔记 | 描述 |
---|---|---|
ROW_FORMAT =冗余 |
在MySQL 5.0.3之前使用的存储格式 | 效率不如ROW_FORMAT =紧凑 ;为了向后兼容 |
ROW_FORMAT =紧凑 |
MySQL 5.0.3以来默认的存储格式 | 在聚集索引页中存储768字节的长列值前缀,其余字节存储在溢出页中 |
ROW_FORMAT =动态 |
在聚集索引页中存储合适的值;如果不是,则仅存储一个指向溢出页的20字节指针(没有前缀)。 | |
ROW_FORMAT =压缩 |
使用zlib压缩表和索引 | |
KEY_BLOCK_SIZE = |
指定压缩页大小为1、2、4、8或16千字节;意味着ROW_FORMAT =压缩 .对于一般表空间,aKEY_BLOCK_SIZE 值等于InnoDB 页面大小不允许。 |
表15.13“CREATE/ALTER Table当InnoDB Strict Mode关闭时的警告和错误”上的某些配置参数和选项组合出现的错误条件创建表
或ALTER TABLE
语句,以及选项如何出现在的输出中显示表状态
.
当innodb_strict_mode
是从
, MySQL创建或修改表,但忽略某些设置,如下所示。您可以在MySQL错误日志中看到警告消息。当innodb_strict_mode
是在
,这些指定的选项组合将生成错误,并且不会创建或更改表。要查看错误条件的完整描述,请发出显示错误
声明:例如:
mysql >创建表x (id INT为主键,c INT为主键)
->引擎= INNODB KEY_BLOCK_SIZE = 33333;
错误1005 (HY000):不能创建表测试。X ' (errno: 1478) mysql>显示错误;
+-------+------+-------------------------------------------+ | 水平| |消息代码 | +-------+------+-------------------------------------------+ | 错误| 1478 | InnoDB:无效KEY_BLOCK_SIZE = 33333。| |错误| 1005 |不能创建测试表。x”(errno: 1478 ) | +-------+------+-------------------------------------------+
表15.13 InnoDB Strict Mode为OFF时CREATE/ALTER Table的警告和错误
语法 | 警告或错误条件 | 结果ROW_FORMAT ,如显示表状态 |
---|---|---|
ROW_FORMAT =冗余 |
没有一个 | 冗余 |
ROW_FORMAT =紧凑 |
没有一个 | 紧凑的 |
ROW_FORMAT =压缩 或ROW_FORMAT =动态 或KEY_BLOCK_SIZE 指定 |
对于每个表文件的表空间,除非忽略innodb_file_per_table 启用。一般表空间支持所有行格式。看到15.6.3.3节“通用表空间”. |
每表文件表空间的默认行格式;通用表空间的指定行格式 |
无效的KEY_BLOCK_SIZE 指定(不是1、2、4、8或16) |
KEY_BLOCK_SIZE 被忽略 |
指定的行格式,或默认的行格式 |
ROW_FORMAT =压缩 和有效KEY_BLOCK_SIZE 指定 |
没有一个;KEY_BLOCK_SIZE 指定使用 |
压缩 |
KEY_BLOCK_SIZE 由冗余 ,紧凑的 或动态 行格式 |
KEY_BLOCK_SIZE 被忽略 |
冗余 ,紧凑的 或动态 |
ROW_FORMAT 不是冗余 ,紧凑的 ,动态 或压缩 |
如果被MySQL解析器识别,则忽略。否则,将发出一个错误。 | 默认行格式或不填写 |
当innodb_strict_mode
是在
MySQL拒绝无效ROW_FORMAT
或KEY_BLOCK_SIZE
参数和问题错误。严格模式为在
默认情况下。当innodb_strict_mode
是从
, MySQL对被忽略的无效参数发出警告而不是错误。
不可能看到被选中的人KEY_BLOCK_SIZE
使用显示表状态
.该声明显示创建表
显示了KEY_BLOCK_SIZE
(即使在创建表时忽略了它)。MySQL无法显示该表的真实压缩页大小。
通用表空间的SQL压缩语法警告和错误
如果
FILE_BLOCK_SIZE
创建表空间时没有为普通表空间定义,因此表空间不能包含压缩表。如果尝试添加压缩表,则返回错误,示例如下:创建表空间为ts1的数据文件为ts1。炎症性肠病的引擎= InnoDB;mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE ts1 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;错误1478 (HY000): InnoDB表空间“ts1”不能包含一个压缩表
试图添加无效的表
KEY_BLOCK_SIZE
返回一个错误,示例如下:创建表空间为ts2的数据文件为ts2。ibd' FILE_BLOCK_SIZE = 8192 Engine=InnoDB;创建表t2 (c1 INT PRIMARY KEY)表空间ts2 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4;错误1478 (HY000): InnoDB表空间' ts2 '使用块大小8192,不能包含物理页大小4096的表
对于一般表空间,使用
KEY_BLOCK_SIZE
表的Of必须等于theFILE_BLOCK_SIZE
表空间的大小除以1024。例如,如果FILE_BLOCK_SIZE
表空间为8192时,则KEY_BLOCK_SIZE
表的第一个必须是8。试图将未压缩行格式的表添加到配置为存储压缩表的通用表空间中,将返回错误,示例如下:
创建表空间为ts3的数据文件为ts3。ibd' FILE_BLOCK_SIZE = 8192 Engine=InnoDB;创建表t3 (c1 INT PRIMARY KEY)表空间ts3错误1478 (HY000): InnoDB表空间' ts3 '使用块大小8192,不能包含物理页大小16384的表
innodb_strict_mode
不适用于一般表空间。一般表空间的表空间管理规则严格地独立于innodb_strict_mode
.有关更多信息,请参见第13.1.21节,创建表空间语句.
有关在一般表空间中使用压缩表的详细信息,请参见15.6.3.3节“通用表空间”.