我需要从旧的 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
- 下
Logs & events
,開PrePatchCompatibility.log
。 - 滚动到最底部,其中列出了错误计数。您可能会看到有错误。
- 向上滚动直到找到错误。就我而言,我看到的是:
16) 文件删除或损坏导致架构不一致
下表显示表 datadir 目录或 frm 文件已被删除/损坏的迹象。请检查服务器日志,检查 datadir 以检测问题并在升级前修复它 some_db - 存在于 INFORMATION_SCHEMA 的 INNODB_SYS_TABLES 表中,但缺失在 TABLES 表中
- 这不是一个特别有用的错误。此错误应该显示类似 的内容
some_db.some_table
,但只列出了一个数据库。 - 运行:
select * from information_schema.innodb_sys_tables where name like '%#%';
就我而言,列出了一张表:some_db/#sql-ib1408
。 - 显然,
alter table
如果语句被打断,就会发生这种情况。不幸的是,跑步drop table `#sql-ib1408`;
不起作用。虽然该链接中的大多数回复重述问题而不是提供解决方案, 一暗示可能的解决方案。 - 运行:
use some_db; drop table `#mysql50##sql-ib1408`;
,将数据库和表名称替换为您自己的名称。#mysql50#
前缀告诉 MySQL 不要尝试对表名进行编码;通常,该#
字符会被编码。 - 重新尝试升级。
请注意,表的存在#sql-ib*
表明您的部分数据可能已损坏。将#sql-ib
表名中的数字 ID 与TABLE_ID
列进行匹配,INNODB_SYS_TABLES
以确定哪个表受到了影响。在继续操作之前,请务必检查数据的完整性。