无法将 RDS 实例从 MySQL 5.7.x 升级到 8.0.x

无法将 RDS 实例从 MySQL 5.7.x 升级到 8.0.x

我需要从旧的 5.6.x 快照中恢复数据。经过一些调整,我成功地在 m3.xlarge 实例上恢复了 5.6.x 快照(除 m3.* 之外的任何实例类型都无法使用)。然后我成功地从 5.6.x 升级到最新的 5.7.x。

下一步是从 5.7.x 升级到 8.0.x。每次我尝试执行升级时,RDS 都会声称它正在“升级”,但它会很快返回“可用”状态,并且会回到 5.7.x,控制台中没有可见的错误。

如何将其升级到 8.0.x?

答案1

  1. Logs & events,開PrePatchCompatibility.log
  2. 滚动到最底部,其中列出了错误计数。您可能会看到有错误。
  3. 向上滚动直到找到错误。就我而言,我看到的是:

16) 文件删除或损坏导致架构不一致
下表显示表 datadir 目录或 frm 文件已被删除/损坏的迹象。请检查服务器日志,检查 datadir 以检测问题并在升级前修复它 some_db - 存在于 INFORMATION_SCHEMA 的 INNODB_SYS_TABLES 表中,但缺失在 TABLES 表中

  1. 这不是一个特别有用的错误。此错误应该显示类似 的内容some_db.some_table,但只列出了一个数据库。
  2. 运行:select * from information_schema.innodb_sys_tables where name like '%#%'; 就我而言,列出了一张表:some_db/#sql-ib1408
  3. 显然,alter table如果语句被打断,就会发生这种情况。不幸的是,跑步drop table `#sql-ib1408`;不起作用。虽然该链接中的大多数回复重述问题而不是提供解决方案, 一暗示可能的解决方案
  4. 运行:use some_db; drop table `#mysql50##sql-ib1408`;,将数据库和表名称替换为您自己的名称。#mysql50#前缀告诉 MySQL 不要尝试对表名进行编码;通常,该#字符会被编码。
  5. 重新尝试升级。

请注意,表的存在#sql-ib*表明您的部分数据可能已损坏。将#sql-ib表名中的数字 ID 与TABLE_ID列进行匹配,INNODB_SYS_TABLES以确定哪个表受到了影响。在继续操作之前,请务必检查数据的完整性。

相关内容