专业的编程技术博客社区

网站首页 > 博客文章 正文

MYSQL存储引擎InnoDB(六十三):SQL压缩语法警告和错误

baijin 2024-09-23 03:44:40 博客文章 5 ℃ 0 评论

独立表空间的 SQL 压缩语法警告和错误

启用innodb_strict_mode时(默认值), 如果禁用innodb_file_per_table,则在CREATE TABLEALTER TABLE 语句中指定ROW_FORMAT=COMPRESSED或 KEY_BLOCK_SIZE会产生以下错误 。

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


innodb_strict_mode被禁用时,如果innodb_file_per_table被禁用,则在CREATE TABLEALTER TABLE 语句中指定ROW_FORMAT=COMPRESSED或 KEY_BLOCK_SIZE会产生以下警告 。

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 配置参数设置。

仅当ROW_FORMAT指定为COMPRESSED或被省略时才允许使用KEY_BLOCK_SIZE属性。将KEY_BLOCK_SIZE与任何其他ROW_FORMAT一起指定会生成一个警告,您可以使用SHOW WARNINGS来查看该警告。但是,该表是未压缩的;指定的KEY_BLOCK_SIZE被忽略。

等级

代码

信息

警告

1478

InnoDB: ignoring KEY_BLOCK_SIZE=n unless ROW_FORMAT=COMPRESSED.

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


选项

使用说明

描述

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_strict_modeOFF时,MySQL 会在创建或更改表时忽略某些设置。您可以在 MySQL 错误日志中看到警告消息。当 innodb_strict_modeON时,这些指定的选项组合会产生错误,并且不会创建或更改表。要查看错误条件的完整描述,请使用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;
+-------+------+-------------------------------------------+
| Level   | Code | Message                                                 |
+-------+------+-------------------------------------------+
| Error | 1478 | InnoDB: invalid KEY_BLOCK_SIZE=33333.  |
| Error | 1005 | Can't create table 'test.x' (errno: 1478)       |
+-------+------+-------------------------------------------+


句法

警告或错误情况

SHOW TABLE STATUS中显示的结果ROW_FORMAT

ROW_FORMAT

=REDUNDANT

没有

REDUNDANT

ROW_FORMAT

=COMPACT

没有

COMPACT

ROW_FORMAT

=COMPRESSED

ROW_FORMAT

=DYNAMIC

指定KEY_BLOCK_SIZE

除非启用innodb_file_per_table,否则独立表空间忽略该设置。通用表空间支持所有行格式。

独立表空间使用默认行格式;通用表空间使用指定的行格式

指定了无效KEY_BLOCK_SIZE(不是 1、2、4、8 或 16)

KEY_BLOCK_SIZE被忽略

指定的行格式,或默认的行格式

ROW_FORMAT

=COMPRESSED

指定了有效KEY_BLOCK_SIZE

没有; 指定KEY_BLOCK_SIZE被使用

COMPRESSED

REDUNDANT、COMPACTDYNAMIC行格式指定KEY_BLOCK_SIZE

KEY_BLOCK_SIZE被忽略

REDUNDANTCOMPACTDYNAMIC

ROW_FORMAT不是 REDUNDANT, COMPACT, DYNAMICCOMPRESSED

如果被 MySQL 解析器识别,则忽略。否则,将发出错误。

默认行格式或 N/A


innodb_strict_mode为ON时,MySQL 拒绝无效 ROW_FORMATKEY_BLOCK_SIZE参数并发出错误。默认情况下innodb_strict_modeON。当 innodb_strict_modeOFF时,MySQL 会针对忽略的无效参数发出警告而不是错误。

使用SHOW TABLE STATUS不能看到选择的KEY_BLOCK_SIZE。使用SHOW CREATE TABLE语句会显示KEY_BLOCK_SIZE (即使它在创建表时被忽略)。MySQL 无法显示表的真实压缩页大小。


通用表空间的 SQL 压缩语法警告和错误

1、如果在创建表空间时没有为通用表空间定义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


2、尝试将无效 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。


3、尝试将具有未压缩行格式的表添加到配置为存储压缩表的通用表空间会返回错误,如以下示例所示:

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不适用于通用表空间。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表