Mysql
無法將 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?
- 下
Logs & events
,打開PrePatchCompatibility.log
。- 滾動到列出錯誤計數的最底部。您可能會看到有錯誤。
- 向上滾動直到找到錯誤。就我而言,我看到:
- 文件刪除或損壞導致架構不一致
下表顯示表 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;
不起作用。雖然該連結上的大多數回复都重申了問題而不是提供解決方案,但其中一個暗示了可能的解決方案。- 執行:
drop table
#mysql50##sql-ib1408;
,將表名替換為您自己的。#mysql50#
前綴告訴 MySQL 不要嘗試對錶名進行編碼;通常,#
字元會被編碼。- 重新嘗試升級。
請注意,
#sql-ib*
表的存在表明您的某些數據可能已損壞。#sql-ib
將表名中的數字 ID 與 的TABLE_ID
列匹配INNODB_SYS_TABLES
以確定受影響的表。在繼續之前,請務必檢查您的數據的完整性。