Documentation Home
MySQL 8.0 参考手册  / 第 15 章 InnoDB 存储引擎  / 14.10 InnoDB 文件格式管理  /  14.10.2 验证文件格式兼容性

14.10.2 验证文件格式兼容性

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

向后兼容性

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

一般来说,较新版本的 InnoDB 可能会创建一个表或索引,无法使用较旧版本的 InnoDB 安全地读取或写入该表或索引,而没有崩溃、挂起、错误结果或损坏的风险。InnoDB 包含一种机制来防止这些情况,并帮助保持数据库文件和 InnoDB 版本之间的兼容性。这种机制允许您利用 InnoDB 版本的一些新功能(例如性能改进和错误修复),并且仍然保留使用旧版本 InnoDB 的数据库的选项,防止意外使用向下创建的新功能-不兼容的磁盘文件。

如果 InnoDB 的某个版本支持特定的文件格式(无论该格式是否为默认格式),您可以查询和更新任何需要该格式或更早格式的表。根据启用的特定文件格式,仅使用新功能创建新表受到限制。相反,如果表空间包含使用不受支持的文件格式的表或索引,则根本无法访问它,即使是读访问也是如此。

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

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

内部细节

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

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

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

ib文件集的定义

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

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

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

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

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

多个表,甚至来自多个数据库,都可以存储在一个ib 文件集中。(在 MySQL 中, 数据库是表的逻辑集合,其他系统称为模式目录。)