下載本手冊
PDF (美式信紙) - 2.3Mb
PDF (A4) - 2.3Mb


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

7.10.2 InnoDB 叢集升級疑難排解

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

處理主機名稱變更

MySQL Shell 使用提供的連線參數的主機值做為 AdminAPI 作業的目標主機名稱,即在後設資料中註冊執行個體 (適用於 dba.createCluster()Cluster.addInstance() 作業)。然而,連線參數所使用的實際主機可能與 Group Replication 所使用或回報的 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_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 值設定為符合叢集建立時在後設資料結構描述中註冊的值。