本節涵蓋升級程序的疑難排解。
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
的值,使其與叢集建立時在元資料結構描述中註冊的值相符。