Mysql

無法將 RDS 實例從 MySQL 5.7.x 升級到 8.0.x

  • February 11, 2020

我需要從舊的 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
  2. 滾動到列出錯誤計數的最底部。您可能會看到有錯誤。
  3. 向上滾動直到找到錯誤。就我而言,我看到:
  1. 文件刪除或損壞導致架構不一致

下表顯示表 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. 執行:drop table #mysql50##sql-ib1408;,將表名替換為您自己的。#mysql50#前綴告訴 MySQL 不要嘗試對錶名進行編碼;通常,#字元會被編碼。
  5. 重新嘗試升級。

請注意,#sql-ib*表的存在表明您的某些數據可能已損壞。#sql-ib將表名中的數字 ID 與 的TABLE_ID列匹配INNODB_SYS_TABLES以確定受影響的表。在繼續之前,請務必檢查您的數據的完整性。

引用自:https://serverfault.com/questions/1002704