下載本手冊
PDF (US Ltr) - 2.2Mb
PDF (A4) - 2.3Mb


MySQL Shell 8.4  /  ...  /  InnoDB 叢集升級疑難排解

7.10.2 InnoDB 叢集升級疑難排解

本節涵蓋升級程序的疑難排解。

處理主機名稱變更

MySQL Shell 使用所提供連線參數的主機值做為 AdminAPI 作業的目標主機名稱,也就是在元資料中註冊執行個體 (用於 dba.createCluster()Cluster.addInstance() 作業)。但是,連線參數的實際主機可能與群組複寫所使用或報告的 hostname 不符,群組複寫會使用 report_host 系統變數的值 (如果已定義,換句話說不是 NULL),否則會使用 hostname 的值。因此,AdminAPI 現在會遵循相同的邏輯,在元資料中註冊目標執行個體,並將其做為執行個體上 group_replication_local_address 變數的預設值,而不是使用執行個體連線參數的主機值。如果 report_host 變數設定為空,群組複寫會使用空值做為主機,但 AdminAPI (例如,在 dba.checkInstanceConfiguration()dba.configureInstance()dba.createCluster() 等命令中) 會將主機名稱報告為所使用的值,這與群組複寫報告的值不一致。如果為 report_host 系統變數設定空值,則會產生錯誤。

對於使用早於 8.0.16 的 MySQL Shell 版本建立的叢集,嘗試使用 8.0.16 或更高版本從完全停機重新啟動叢集會導致此錯誤。這是因為元資料值與執行個體報告的 report_hosthostname 值不符。解決方法是:

  1. 識別哪個執行個體是 種子,換句話說,就是具有最新 GTID 集的執行個體。dba.rebootClusterFromCompleteOutage() 作業會偵測執行個體是否為種子,而且如果目前的連線未連線到最新的執行個體,則作業會產生錯誤。

  2. report_host 系統變數設定為目標執行個體的元資料結構描述中儲存的值。此值是在叢集建立時執行個體定義中使用的 hostname:port 配對。您可以查詢 mysql_innodb_cluster_metadata.instances 資料表來查詢此值。

    例如,假設使用下列命令序列建立叢集

    mysql-js> \c clusterAdmin@localhost:3306
    mysql-js> dba.createCluster("myCluster")

    因此,元資料中儲存的主機名稱值為 localhost,因此,report_host 必須在種子上設定為 localhost

  3. 只使用種子執行個體重新啟動叢集。在互動式提示中,請勿將其餘執行個體新增至叢集。

  4. 使用 Cluster.rescan() 將其他執行個體加回叢集。

  5. 從叢集中移除種子執行個體

  6. 停止種子執行個體上的 mysqld,然後移除強制 report_host 設定 (步驟 2),或將其取代為先前儲存在元資料值中的值。

  7. 重新啟動種子執行個體,並使用 Cluster.addInstance() 將其加回叢集

這樣可以順利且完整地將叢集升級到最新的 MySQL Shell 版本。另一個取決於使用案例的可能性,是在所有叢集成員上設定 report_host 的值,使其與叢集建立時在元資料結構描述中註冊的值相符。