贝利信息

mysql版本升级中的存储引擎差异与迁移方案

日期:2026-01-08 00:00 / 作者:P粉602998670
MySQL 8.0 升级后 InnoDB 表无法启动,因移除 Antelope 格式支持,需升级前将 FILE_FORMAT=Antelope 表转为 Barracuda;系统表空间表须导出导入;MEMORY 表数据必丢失,ARCHIVE 等第三方引擎不兼容,须逻辑迁移。

MySQL 5.7 升级到 8.0 后 InnoDB 表无法启动?检查 innodb_file_formatinnodb_file_per_table

MySQL 8.0 彻底移除了对 Antelope 文件格式的支持,只保留 Barracuda。如果你的 5.7 实例中存在 ROW_FORMAT=COMPACTREDUNDANTFILE_FORMAT=Antelope 的表,在升级后可能报错 Tablespace is missing for table xxx 或直接拒绝加载。

实操建议:

MyISAM 迁移到 InnoDB 时主键和全文索引行为不一致

MyISAM 允许无主键、支持全文索引无需额外配置;InnoDB 要求显式主键(否则隐式生成 6 字节 row_id),且全文索引需 innodb_ft_enable_stopword=ON 并重建索引才能生效。

实操建议:

MEMORY 表升级后数据丢失且无法持久化?别依赖它存关键状态

MEMORY 引擎在 MySQL 8.0 中未变更语义,但升级过程必然重启 mysqld,所有 MEMORY 表数据清空。更关键的是:8.0 默认启用 skip_log_bin 以外的二进制日志策略,而 MEMORY 表的 DML 不写 binlog,主从复制中不会同步,容易造成一致性幻觉。

实操建议:

ARCHIVECOLUMNSTORE 等第三方引擎在 8.0 中不再兼容

MySQL 官方 8.0 不再打包 ARCHIVE 引擎(虽仍可编译启用),而 MariaDB 的 ColumnStore、Percona 的 TokuDB(已弃用)等完全不兼容 8.0 的数据字典重构。强行拷贝表文件会导致 Table 'xxx' doesn't exist 或崩溃。

实操建议:

最易被忽略的一点:MySQL 8.0 的数据字典完全内置于 INFORMATION_SCHEMA,所有表元信息不再依赖磁盘上的 .frm 文件。这意味着任何绕过 DDL 直接操作文件系统(如 cp / mv .ibd)的行为,在 8.0 中大概率失败 —— 迁移必须走逻辑导出或官方 mysql_upgrade(仅限 5.7→8.0 小版本)流程。