本節涵蓋升級程序的疑難排解。
MySQL Shell 使用提供的連線參數的主機值做為 AdminAPI 作業的目標主機名稱,即在後設資料中註冊執行個體 (適用於 dba.createCluster()
和
作業)。然而,連線參數所使用的實際主機可能與 Group Replication 所使用或回報的 Cluster
.addInstance()hostname
不符,當 report_host
系統變數已定義時 (換句話說,它不是 NULL
),Group Replication 會使用該變數的值,否則會使用 hostname
的值。因此,AdminAPI 現在會遵循相同的邏輯,在後設資料中註冊目標執行個體,並做為執行個體上 group_replication_local_address
變數的預設值,而不是使用執行個體連線參數中的主機值。當 report_host
變數設定為空值時,Group Replication 會使用空值做為主機,但 AdminAPI (例如在 dba.checkInstanceConfiguration()
、dba.configureInstance()
、dba.createCluster()
等命令中) 會回報主機名稱為使用的值,這與 Group Replication 所回報的值不一致。如果為 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
值設定為符合叢集建立時在後設資料結構描述中註冊的值。