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

Zen*_*xer 5 mysql amazon-web-services amazon-rds

我需要从旧的 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?

Zen*_*xer 14

  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`;,将数据库和表名称替换为您自己的名称。前缀告诉 MySQL 不要尝试对表名进行#mysql50#编码;通常,字符会被编码。#
  5. 重新尝试升级。

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

  • LGTM。在“drop table”语句之前执行“use xxxxx”,将数据库告知数据库引擎。 (2认同)