• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • SQL压缩语法警告和错误

    本节介绍将表压缩功能与每表文件表空间和常规表空间一起使用时可能遇到的语法警告和错误。

    每表文件表空间的SQL压缩语法警告和错误

    innodb_strict_mode被使能(默认值),指定ROW_FORMAT=COMPRESSEDKEY_BLOCK_SIZECREATE TABLEALTER TABLE语句如果产生以下错误innodb_file_per_table被禁止。

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

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

    如果innodb_strict_mode禁用,则在禁用时在or 语句中指定ROW_FORMAT=COMPRESSEDor 会产生以下警告。KEY_BLOCK_SIZECREATE TABLEALTER TABLEinnodb_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仅当ROW_FORMAT指定为COMPRESSED或省略时,才允许该属性。KEY_BLOCK_SIZE与其他参数一起指定会ROW_FORMAT生成警告,您可以使用参见SHOW WARNINGS。但是,该表是未压缩的。指定的内容将KEY_BLOCK_SIZE被忽略)。

    水平信息
    警告1478InnoDB: ignoring KEY_BLOCK_SIZE=n unless ROW_FORMAT=COMPRESSED.

    如果正在innodb_strict_mode启用的情况下运行,则a KEY_BLOCK_SIZEROW_FORMAT其他任何项的组合都会COMPRESSED生成错误(不是警告),并且不会创建表。

    “ ROW_FORMAT和KEY_BLOCK_SIZE选项”概述了或与一起使用的ROW_FORMATKEY_BLOCK_SIZE选项。CREATE TABLEALTER TABLE

    ROW_FORMAT和KEY_BLOCK_SIZE选项

    选项使用说明描述
    ROW_FORMAT=REDUNDANTMySQL 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严格模式时的创建/更改表警告和错误”总结了CREATE TABLEor ALTER TABLE语句上某些配置参数和选项的组合所发生的错误情况,以及这些选项如何显示在上SHOW TABLE STATUS

    innodb_strict_modeOFF时,MySQL创建或改变表,但如下所示忽略某些设置。您可以在MySQL错误日志中看到警告消息。当innodb_strict_mode为时ON,这些指定的选项组合会生成错误,并且不会创建或更改表。要参见错误条件的完整描述,请发出以下SHOW ERRORS语句:示例:

    mysql> CREATE TABLE x (id INT PRIMARY KEY, c INT)
    
    ->ENGINE=INNODB KEY_BLOCK_SIZE=33333;
    
    错误1005(HY000):无法创建表“ test.x”(错误号:1478)
    
    mysql> SHOW ERRORS;
    + ------- + ------ + ---------------------------------- --------- +
    | 级别| 代码 留言|
    + ------- + ------ + ---------------------------------- --------- +
    | 错误 1478 | InnoDB:无效的KEY_BLOCK_SIZE = 33333。|
    | 错误 1005 | 无法创建表“ test.x”(错误号:1478)|
    + ------- + ------ + ---------------------------------- --------- +
    

    InnoDB严格模式为OFF时的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启用,否则忽略每表文件表空间。常规表空间支持所有行格式。请参见“通用表空间”。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=COMPRESSED和有效KEY_BLOCK_SIZE被指定没有;KEY_BLOCK_SIZE指定使用COMPRESSED
    KEY_BLOCK_SIZE与指定的REDUNDANTCOMPACTDYNAMIC行格式KEY_BLOCK_SIZE被忽略REDUNDANTCOMPACTDYNAMIC
    ROW_FORMAT是没有一个REDUNDANTCOMPACTDYNAMICCOMPRESSED如果被MySQL解析器识别,则将其忽略。否则,将发出错误。默认行格式或不适用

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

    这是不可能看到所选择的KEY_BLOCK_SIZE使用SHOW 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。有关更多信息,请参见“ CREATE TABLESPACE语句”。

    有关将压缩表与常规表空间一起使用的更多信息,请参见“通用表空间”。