14.10.2 验证文件格式兼容性

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

Backward Compatibility

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

通常,较新版本的 InnoDB 可能会创建一个 table 或索引,该 table 或索引无法安全地用较早版本的 InnoDB 读取或写入,而不会导致崩溃,死机,错误的结果或损坏。 InnoDB 包括一种机制,可以防止这些情况,并有助于保持数据库文件和 InnoDB 版本之间的兼容性。这种机制使您可以利用 InnoDB 版本的一些新功能(例如性能改进和错误修复),并通过防止意外使用向下创建的新功能,仍然保留将数据库与旧版本的 InnoDB 一起使用的选项。 -不兼容的磁盘文件。

如果 InnoDB 版本支持特定的文件格式(默认格式是否为该格式),则可以查询和更新任何需要该格式或更早格式的 table。仅基于启用的特定文件格式来限制使用新功能创建新 table。相反,如果 table 空间包含使用不支持的文件格式的 table 或索引,则即使进行读取访问,也无法访问该 table 或索引。

将 InnoDBtable 空间“降级”为较早的 Antelope 文件格式的唯一方法是将数据复制到使用较早格式的 table 空间中的新 table 中。

确定现有 InnoDBtable 空间文件格式的最简单方法是使用SHOW TABLE STATUS命令或查询 tableINFORMATION_SCHEMA.TABLES来检查其中包含的 table 的属性。如果 table 的Row_format报告为'Compressed''Dynamic',则包含 table 的 table 空间支持梭子鱼格式。

Internal Details

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

创建压缩 table 或带有ROW_FORMAT=DYNAMIC的 table 会更新每个 table.ibd文件的文件头,并使用梭子鱼文件格式的标识符更新 InnoDB 数据字典中的 table 类型。从那时起,该 table 不能与不支持梭子鱼文件格式的 InnoDB 版本一起使用。为了防止异常行为,打开 table 时,InnoDB 会执行兼容性检查。 (在许多情况下,ALTER TABLE语句会重新创建 table 并因此更改其属性。在第 14.13.1 节“在线 DDL 操作”中描述了在不重建 table 的情况下添加或删除索引的特殊情况。)

通用 table 空间也由*.ibd文件 table 示,同时支持 Antelope 和 Barracuda 文件格式。有关常规 table 空间的更多信息,请参见第 14.6.3.3 节“常规 table 空间”

ib 文件集的定义

为避免混淆,出于讨论目的,我们定义术语“ ib 文件集”来 table 示 InnoDB 作为一个单元 Management 的 os 文件集。 ib 文件集包括以下文件:

  • 系统 table 空间(一个或多个ibdata文件)包含内部系统信息(包括内部目录和撤消信息),并且可能包含用户数据和索引。

  • 零个或多个单 tabletable 空间(也称为“每个 table 的文件”文件,名为*.ibd文件)。

  • InnoDB 日志文件;通常是两个ib_logfile0ib_logfile1。用于崩溃恢复和备份。

“ ib 文件集”不包括包含有关 InnoDBtable 元数据的.frm文件。 .frm文件由 MySQL 创建和 Management,有时可能与 InnoDB 中的内部元数据不同步。

即使来自多个数据库,也可以将多个 table 存储在单个“ ib 文件集”中。 (在 MySQL 中,“数据库”是 table 的逻辑集合,其他系统将其称为“模式”或“目录”.)