mysql innodb 版本(MYSQL存储引擎InnoDB六十三)

启用innodb_strict_mode时(默认值), 如果禁用innodb_file_per_table,则在CREATE TABLE或ALTER TABLE 语句中指定ROW_FORMAT=COMPRESSED或 KEY_BLOCK_SIZE会产生以下错误 ,我来为大家讲解一下关于mysql innodb 版本?跟着小编一起来看一看吧!

mysql innodb 版本(MYSQL存储引擎InnoDB六十三)

mysql innodb 版本

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

启用innodb_strict_mode时(默认值), 如果禁用innodb_file_per_table,则在CREATE TABLE或ALTER 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 TABLE或ALTER 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_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; 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被忽略

REDUNDANT、COMPACT或 DYNAMIC

ROW_FORMAT不是 REDUNDANT, COMPACT, DYNAMICCOMPRESSED

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

默认行格式或 N/A

当innodb_strict_mode为ON时,MySQL 拒绝无效 ROW_FORMAT或 KEY_BLOCK_SIZE参数并发出错误。默认情况下innodb_strict_mode为ON。当 innodb_strict_mode为OFF时,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不适用于通用表空间。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页