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_logfile0
和ib_logfile1
。用于崩溃恢复和备份。
“ ib-file set ”不包括
.frm
包含有关 InnoDB 表的元数据的相应文件。这些.frm
文件由 MySQL 创建和管理,有时会与 InnoDB 中的内部元数据不同步。
多个表,甚至来自多个数据库,都可以存储在一个“ ib 文件集”中。(在 MySQL 中, “数据库”是表的逻辑集合,其他系统称为“模式”或 “目录”。)