【问题标题】:mysql 5.7 to 5.8 upgrade bump into upgrade error "Unknown storage engine 'partition'"mysql 5.7 到 5.8 升级碰到升级错误“Unknown storage engine 'partition'”
【发布时间】:2026-02-23 04:00:01
【问题描述】:

我最近尝试将我的 MySQL 服务器从 5.6 升级到 8.0。由于我们不能跳过主要版本,我首先将 5.6 升级到 5.7。升级过程花费了一段时间,但它是成功的(Windows 服务器操作系统,使用 zip 存档替换)。

但是在我用 8.0 二进制文件替换 5.7 并启动 mysql 服务后,它遇到了错误,我无法弄清楚是什么问题:

[System] [MY-011012] [Server] Starting upgrade of data directory.
[ERROR] [MY-013140] [Server] Unknown storage engine 'partition'
[ERROR] [MY-013140] [Server] Can't find file: '.\some_db\some_table.frm' (errno: 0 - No error)
[ERROR] [MY-013137] [Server] Can't find file: '.\some_db\some_table.frm' (OS errno: 0 - No error)
[ERROR] [MY-010348] [Server] Error in reading file .\some_db\some_table.frm
[ERROR] [MY-010758] [Server] Error in creating TABLE_SHARE from some_table.frm file.

我知道 mysql 8 不再支持服务器分区,但是“some_table”是一个带有 innodb 分区的表。它使用 Innodb 存储引擎。我不明白为什么错误显示“分区”存储引擎,以及无法找到 .frm 文件。有人遇到过类似的问题吗?

【问题讨论】:

  • 执行升级时,必须转储并重新加载按 KEY 分区的表。使用 InnoDB 以外的存储引擎的分区表不能从 MySQL 5.7 或更早版本升级到 MySQL 8.0 或更高版本;您必须在升级之前使用 ALTER TABLE ... REMOVE PARTITIONING 从此类表中删除分区,或者使用 ALTER TABLE ... ENGINE=INNODB 将它们转换为 InnoDB。
  • 是的,我阅读了这个条款,但是 mysql_upgrade 过程不完整。请参阅下面的答案,必须向每个分区表(InnoDB)发出额外的升级分区命令。

标签: mysql


【解决方案1】:

为了记录,我在再次查看 mysql 文档后找到了根本原因。貌似最新的mysql 5.7(5.7.21)没有进行分区升级或者分区检查。在将服务器升级到 8.0 之前,我必须对所有受影响的表执行以下命令。

ALTER TABLE some_db.some_table UPGRADE PARTITIONING;

一旦在所有表中完成此操作(非常快速的过程,只需更改元数据),升级到 8.0 就没有任何问题。我不明白的是为什么更高版本的 5.7.x 没有在 mysql_upgrade 中完成这一步,而且我不确定在 mysql_upgrade 期间这些分区表中做了什么,这需要将近 2 天才能完成。也许 MySQL 开发团队这样做是有原因的,但对我来说这毫无意义。

【讨论】: