ITPub博客

首页 > 数据库 > > 14.10 InnoDB 文件格式管理

14.10 InnoDB 文件格式管理

作者:飘絮絮絮丶 时间:2020-05-12 09:57:55 0 删除 编辑

参考官方文档:
dev.mysql.com/doc/refma




随着InnoDB的发展,有时需要与早期版本的InnoDB不兼容的数据文件格式来支持新功能。 为了帮助管理升级和降级情况的兼容性,以及运行不同版本MySQL的系统,InnoDB使用命名文件格式。 InnoDB目前支持两种命名文件格式,Antelope和Barracuda。

  • Antelope是原始的InnoDB文件格式,以前没有名称。 它支持InnoDB表的COMPACT和REDUNDANT行格式。
  • Barracuda是最新的文件格式。 它支持所有InnoDB行格式,包括较新的COMPRESSED和DYNAMIC行格式。 与COMPRESSED和DYNAMIC行格式相关的功能,包括压缩表,页外列的高效存储以及最多3072字节的索引键前缀(innodb_large_prefix)。


本节讨论为新InnoDB表启用InnoDB文件格式,验证MySQL版本之间不同文件格式的兼容性,以及识别正在使用的文件格式。


InnoDB文件格式设置不适用于存储在常规表空间中的表。 常规表空间支持所有行格式和相关功能。


注意:
以下文件格式配置参数具有新的默认值:

  • innodb_file_format默认值已更改为Barracuda。 以前的默认值是Antelope。
  • innodb_large_prefix默认值已更改为ON。 之前的默认值为OFF。

不推荐使用以下文件格式配置参数,可能会在以后的版本中将其删除:

  • innodb_file_format
  • innodb_file_format_check
  • innodb_file_format_max
  • innodb_large_prefix


    14.10.1 启用 文件格式


    innodb_file_format配置选项为每个表的文件表空间启用InnoDB文件格式。

    Barracuda是默认的innodb_file_format设置。 在早期版本中,默认文件格式为Antelope。


    注意:
    不推荐使用innodb_file_format配置选项,可能会在将来的版本中将其删除。


    您可以在启动mysqld时在命令行上设置innodb_file_format的值,也可以在选项文件(Unix上的my.cnf,Windows上的my.ini)中设置innodb_file_format的值。 您还可以使用SET GLOBAL语句动态更改它。


    SET GLOBAL innodb_file_format=Barracuda;




    使用事项
  • InnoDB文件格式设置不适用于存储在常规表空间中的表。 常规表空间支持所有行格式和相关功能。
  • 使用带有CREATE TABLE或ALTER TABLE的TABLESPACE [=] innodb_system表选项在系统表空间中存储DYNAMIC表时,innodb_file_format设置不适用。
  • 创建使用DYNAMIC行格式的表时,将忽略innodb_file_format设置。



14.10.2 验证文件格式兼容性


InnoDB包含多项检查,以防止在使用较新文件格式的InnoDB数据文件上运行旧版MySQL服务器时可能发生的崩溃和数据损坏。 这些检查在服务器启动时以及首次访问表时进行。 本节介绍这些检查,如何控制它们以及可能出现的错误和警告情况。



向后兼容性


当使用最新版本的InnoDB(带有InnoDB的MySQL 5.5及更高版本)和旧版本(MySQL 5.1或更早版本,内置InnoDB而不是InnoDB插件)时,您只需要考虑向后文件格式兼容性。为了最大限度地减少兼容性问题,您可以为所有MySQL 5.1及更早版本的数据库服务器标准化InnoDB插件。


确定现有InnoDB表空间的文件格式的最简单方法是使用SHOW TABLE STATUS命令或查询表INFORMATION_SCHEMA.TABLES来检查它包含的表的属性。 如果表的Row_format报告为“ Compressed”或“ Dynamic”,则包含该表的表空间支持 Barracuda 格式。



内部细节


每个InnoDB文件每表表空间(由* .ibd文件表示)文件都标有文件格式标识符。 系统表空间(由ibdata文件表示)使用一组InnoDB数据库文件中使用的“最高”文件格式进行标记,并在打开文件时检查此标记。


创建压缩表或一个表 ROW_FORMAT=DYNAMIC,为 Barracuda 格式更新每个表的相关.idb文件的头和在数据字典中的定义


一般表空间也由* .ibd文件表示,支持Antelope和Barracuda文件格式



ib文件集的定义


为避免混淆,为了便于讨论,我们将术语“ib-file set”定义为InnoDB作为一个单元管理的操作系统文件集。 ib文件集包括以下文件:

  • 系统表空间(一个或多个ibdata文件),包含内部系统信息(包括内部目录和撤消信息),可能包括用户数据和索引。
  • 零个或多个单表表空间(也称为“每个表的文件”文件,名为* .ibd文件)。
  • InnoDB日志文件; 通常是两个,ib_logfile0和ib_logfile1。 用于崩溃恢复和备份。

    “ib-file set”不包含包含有关InnoDB表的元数据的相应.frm文件。 .frm文件由MySQL创建和管理,有时可能与InnoDB中的内部元数据不同步。


    多个表,甚至来自多个数据库,可以存储在单个“ib文件集”中。 (在MySQL中,“数据库”是表的逻辑集合,其他系统称为“ schema”或“catalog”。)





    14.10.2.1 当InnoDB 被启动时检查兼容性


    为防止InnoDB打开ib文件集时可能发生的崩溃或数据损坏,它会检查它是否可以完全支持ib文件集中使用的文件格式。 如果系统在崩溃后重新启动,或者“快速关闭”(即innodb_fast_shutdown大于零),则可能存在磁盘上的数据结构(例如重做或撤消条目或双写页面) 对于“当前软件的格式太新。 在恢复过程中,如果访问这些数据结构,则可能会对数据文件造成严重损坏。 在任何恢复过程开始之前,都会对文件格式进行启动检查,从而防止新表的一致性问题或MySQL服务器的启动问题。


    从InnoDB 1.0.1开始,系统表空间记录任何表空间中任何表使用的“最高”文件格式的标识符或标记,该表空间是ib文件集的一部分。 对此文件格式标记的检查由配置参数innodb_file_format_check控制,默认情况下为ON。


    如果系统表空间中的文件格式标记比当前正在执行的特定软件支持的最高版本更新或更高,并且innodb_file_format_check为ON,则在启动服务器时会发出以下错误:


    InnoDB: Error: the system tablespace is in a file format that this version doesn't support



    您还可以将innodb_file_format设置为文件格式名称。 如果当前软件不支持指定的文件格式,则这样做会阻止InnoDB启动。 它还将“高水位线”设置为您指定的值。 如果您手动“降级”ib文件集中的所有表,则设置innodb_file_format_check的功能很有用(对于将来的版本)。 如果随后使用较旧版本的InnoDB访问ib文件集,则可以在启动时依赖文件格式检查。


    在某些有限的情况下,您可能需要启动服务器并使用新文件格式的ib文件集,而您使用的软件不支持该文件格式。 如果将配置参数innodb_file_format_check设置为OFF,则InnoDB会打开数据库,但会在错误日志中发出此警告消息:


    InnoDB: Warning: the system tablespace is in a file format that this version doesn't support



    注意:
    这是一个危险的设置,因为它允许恢复进程运行,如果先前的关闭是崩溃或“快速关闭”,可能会破坏您的数据库。 如果您确定先前的关闭是使用innodb_fast_shutdown = 0完成的,那么您应该只将innodb_file_format_check设置为OFF,这样基本上不会发生恢复过程。


    参数innodb_file_format_check仅影响打开数据库时发生的情况,而不影响随后的情况。 相反,参数innodb_file_format(启用特定格式)仅确定是否可以以启用格式创建新表,并且不影响是否可以打开数据库。


    文件格式标记是“高水位线”,如果创建“更高”格式的表或访问现有表进行读取或写入(假设其格式为 支持的),在服务器启动后增加。 如果以高于正在运行的软件支持的格式访问现有表,则系统表空间标记不会更新,但会应用表级兼容性检查(并发出错误),如第14.10.2.2节中所述, 打开表时的兼容性检查“。 每当更新高水位标记时,innodb_file_format_check的值也会更新,因此命令SELECT @@ innodb_file_format_check; 显示当前打开的ib文件集中的表已知并由当前正在执行的软件支持的最新文件格式的名称。



    14.10.2.2 当一个表被打开时检查兼容性


    首次访问表时,InnoDB(包括InnoDB 1.0之前的某些版本)会检查是否完全支持存储表的表空间的文件格式。 此检查可防止在遇到使用“太新”数据结构的表时发生的崩溃或损坏。


    可以读取或写入使用发行版支持的任何文件格式的所有表(假设用户具有足够的权限)。 系统配置参数innodb_file_format的设置可能会阻止创建使用特定文件格式的新表,即使给定版本支持该文件格式也是如此。 此类设置可能用于保留向后兼容性,但不会阻止访问使用支持格式的任何表。


    如果在创建表时使用了新的文件格式,则早于5.0.21的MySQL版本无法可靠地使用由较新版本创建的数据库文件。 为了防止各种错误情况或损坏,InnoDB在打开文件时检查文件格式兼容性(例如,首次访问表时)。 如果当前运行的InnoDB版本不支持InnoDB数据字典中表类型标识的文件格式,则MySQL会报告以下错误:


    ERROR 1146 (42S02): Table 'test.t1' doesn't exist


    InnoDB还会向错误日志写入一条消息:


    InnoDB: table test/t1: unknown table type 33


    表类型应该等于表空间标志,其中包含文件格式版本,如第14.10.3节“识别正在使用的文件格式”中所述。


    MySQL 4.1之前的InnoDB版本在数据库文件中不包含表格格式标识符,而MySQL 5.0.21之前的版本不包括表格格式兼容性检查。 因此,如果将较新文件格式的表与5.0.21之前的InnoDB版本一起使用,则无法确保正常操作。


    InnoDB 1.0及更高版本(表空间标记和运行时检查)中的文件格式管理功能允许InnoDB尽快验证正在运行的软件版本是否可以正确处理数据库中存在的表。


    如果允许InnoDB以不支持的格式打开包含文件的数据库(通过将参数innodb_file_format_check设置为OFF),则本节中描述的表级检查仍然适用。


    强烈建议用户不要使用包含 Barracuda 文件格式表的数据库文件,其中InnoDB版本早于带有InnoDB插件的MySQL 5.1。 可以重建这些表以使用Antelope格式。




    14.10.3 识别正在使用的文件格式


    如果使用innodb_file_format配置选项启用其他文件格式,则更改仅适用于新创建的表。 此外,当您创建新表时,包含该表的表空间将标记为支持表功能所需的“最早”或“最简单”文件格式。 例如,如果启用Barracuda文件格式,并创建不使用动态或压缩行格式的新表,则包含该表的新表空间将使用Antelope文件格式标记。




    很容易识别给定表使用的文件格式。 如果SHOW TABLE STATUS报告的行格式是Compact或Redundant,则表使用Antelope文件格式。 如果SHOW TABLE STATUS报告的行格式是Compressed或Dynamic,则该表使用Barracuda文件格式。


    您还可以使用InnoDB INFORMATION_SCHEMA表来标识给定表或表空间使用的文件格式。 例如:


    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME='test/t1'\G *************************** 1. row ***************************
    TABLE_ID: 44
    NAME: test/t1
    FLAG: 1
    N_COLS: 6
    SPACE: 30
    FILE_FORMAT: Antelope
    ROW_FORMAT: Compact
    ZIP_PAGE_SIZE: 0
    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES WHERE NAME='test/t1'\G *************************** 1. row ***************************
    SPACE: 30
    NAME: test/t1
    FLAG: 0
    FILE_FORMAT: Antelope
    ROW_FORMAT: Compact or Redundant
    PAGE_SIZE: 16384
    ZIP_PAGE_SIZE: 0



    14.10.4 修改文件格式


    每个InnoDB表空间文件(名称与* .ibd匹配)都标记有用于创建其表和索引的文件格式。 修改文件格式的方法是重新创建表及其索引。 重新创建表及其索引的最简单方法是在要修改的每个表上使用以下命令:


    ALTER TABLE t ROW_FORMAT=format_name;


    如果要修改文件格式以降级到较旧的MySQL版本,则表格存储格式可能存在不兼容性,需要执行其他步骤。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69946831/viewspace-3160252/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-09-09

  • 博文量
    2646
  • 访问量
    42206