本節涵蓋升級程序的疑難排解。
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_host 或 hostname 值不符。解決方法是:
識別哪個執行個體是 「種子」,換句話說,就是具有最新 GTID 集的執行個體。
dba.rebootClusterFromCompleteOutage()作業會偵測執行個體是否為種子,而且如果目前的連線未連線到最新的執行個體,則作業會產生錯誤。-
將
report_host系統變數設定為目標執行個體的元資料結構描述中儲存的值。此值是在叢集建立時執行個體定義中使用的hostname:port配對。您可以查詢mysql_innodb_cluster_metadata.instances資料表來查詢此值。例如,假設使用下列命令序列建立叢集
mysql-js> \c clusterAdmin@localhost:3306 mysql-js> dba.createCluster("myCluster")因此,元資料中儲存的主機名稱值為 「localhost」,因此,
report_host必須在種子上設定為 「localhost」。 只使用種子執行個體重新啟動叢集。在互動式提示中,請勿將其餘執行個體新增至叢集。
使用
將其他執行個體加回叢集。Cluster.rescan()從叢集中移除種子執行個體
停止種子執行個體上的 mysqld,然後移除強制
report_host設定 (步驟 2),或將其取代為先前儲存在元資料值中的值。重新啟動種子執行個體,並使用
將其加回叢集Cluster.addInstance()
這樣可以順利且完整地將叢集升級到最新的 MySQL Shell 版本。另一個取決於使用案例的可能性,是在所有叢集成員上設定 report_host 的值,使其與叢集建立時在元資料結構描述中註冊的值相符。