暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

[ACDU 翻译] MySQL 15.9.1.7 SQL 压缩语法警告和错误

原创 由迪 2022-05-24
1267

本节介绍了在将表压缩功能与file-per-table 表 空间和通用表空间 一起使用时可能遇到的语法警告和错误 。

File-Per-Table 表空间的 SQL 压缩语法警告和错误

启用时innodb_strict_mode(默认值), 如果禁用 ,指定ROW_FORMAT=COMPRESSEDor KEY_BLOCK_SIZEin CREATE TABLEorALTER TABLE 语句会产生以下错误 。innodb_file_per_table

ERROR 1031 (HY000): Table storage engine for 't1' doesn't have this option

笔记

如果当前配置不允许使用压缩表,则不会创建该表。

innodb_strict_mode被禁用时,如果被禁用,指定ROW_FORMAT=COMPRESSEDor KEY_BLOCK_SIZEin CREATE TABLEorALTER 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=*n* unless ROW_FORMAT=COMPRESSED.

如果您在 innodb_strict_mode启用的情况下运行,则 aKEY_BLOCK_SIZE与任何 ROW_FORMAT其他 的组合会COMPRESSED生成错误,而不是警告,并且不会创建表。

表 15.12,“ROW_FORMAT 和 KEY_BLOCK_SIZE 选项”提供了与or 一起使用 的选项ROW_FORMAT和 选项 的概述。 KEY_BLOCK_SIZECREATE TABLEALTER 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=*n* 指定 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_modeis 时OFF,MySQL 创建或更改表,但忽略某些设置,如下所示。您可以在 MySQL 错误日志中看到警告消息。当 innodb_strict_modeis 时ON,这些指定的选项组合会产生错误,并且不会创建或更改表。要查看错误条件的完整描述,请发出以下 SHOW ERRORS语句:示例:

mysql> CREATE TABLE x (id INT PRIMARY KEY, c INT)

-> ENGINE=INNODB KEY_BLOCK_SIZE=33333;

ERROR 1005 (HY000): Can't create table 'test.x' (errno: 1478) 

mysql> SHOW ERRORS;
+-------+------+------- ------------------------------------+ 
| 水平 | 代码 | 留言 | 
+--------+------+---------------------------------- ---------+ 
| 错误 | 第1478章 InnoDB:无效的 KEY_BLOCK_SIZE=33333。| 
| 错误 | 1005 | 无法创建表 'test.x' (errno: 1478) | 
+--------+------+---------------------------------- ---------+

表 15.13 InnoDB 严格模式关闭时的 CREATE/ALTER TABLE 警告和错误

句法 警告或错误情况 结果ROW_FORMAT,如图SHOW TABLE STATUS
ROW_FORMAT=REDUNDANT 没有任何 REDUNDANT
ROW_FORMAT=COMPACT 没有任何 COMPACT
ROW_FORMAT=COMPRESSEDROW_FORMAT=DYNAMICKEY_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=COMPRESSEDKEY_BLOCK_SIZE指定了有效 没有任何; KEY_BLOCK_SIZE指定使用 COMPRESSED
KEY_BLOCK_SIZEREDUNDANT或行格式COMPACT 指定DYNAMIC KEY_BLOCK_SIZE被忽略 REDUNDANT,COMPACTDYNAMIC
ROW_FORMAT不是 REDUNDANT, COMPACT, DYNAMICCOMPRESSED 如果被 MySQL 解析器识别,则忽略。否则,将发出错误。 默认行格式或 N/A

innodb_strict_modeis 时ON,MySQL 拒绝无效 ROW_FORMATKEY_BLOCK_SIZE参数并发出错误。默认情况下为严格模式ON。当 innodb_strict_modeis时OFF,MySQL 会针对忽略的无效参数发出警告而不是错误。

使用是不可能看到选择 KEY_BLOCK_SIZESHOW 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 节,“通用表空间”

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论