10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 下载本手册 本手册节选

15.9.1.7 SQL压缩语法警告和错误

本节描述在使用表压缩特性时可能遇到的语法警告和错误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=n除非ROW_FORMAT =压缩。

如果你在跑步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 =n 指定压缩页大小为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_modeMySQL拒绝无效ROW_FORMATKEY_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节“通用表空间”