如果 InnoDB 叢集是 InnoDB ClusterSet 部署的一部分,只要叢集運作正常且未被標記為無效,MySQL Shell 會在重新啟動後立即將其還原至拓樸中的角色。然而,如果叢集被標記為無效,或其 ClusterSet 複寫通道已停止,您必須使用 作業將其重新加入 InnoDB ClusterSet 部署。clusterSet.rejoinCluster()
作業會驗證目標叢集是否符合下列需求clusterSet.rejoinCluster()
該叢集之前曾是 ClusterSet 的成員。
該叢集具有仲裁 (有足夠的成員上線以形成多數)。
該叢集的主要伺服器可連線。
該叢集未持有任何中繼資料鎖定或 InnoDB 交易鎖定。
與 ClusterSet 的作用中成員相比,該叢集的 GTID 集 (
gtid_executed) 不包含任何額外的交易,但檢視變更事件除外。這些群組複寫內部交易會由group_replication_view_change_uuid系統變數指定的 UUID 識別,並且叢集重新加入程序可以協調它們。
如果叢集符合這些需求,該作業會重新啟動 ClusterSet 複寫通道並移除 INVALIDATED 狀態。如果沒有,您需要修正任何已識別的問題並重試該命令。
請依照下列程序將 InnoDB 叢集重新加入 InnoDB ClusterSet
-
使用 MySQL Shell,使用 InnoDB 叢集管理員帳戶 (使用
建立) 連線至主要叢集或其中一個複本叢集中的任何成員伺服器。您也可以使用 InnoDB 叢集伺服器組態帳戶,該帳戶也具有所需的權限。建立連線後,使用cluster.setupAdminAccount()dba.getClusterSet()或命令取得cluster.getClusterSet()ClusterSet物件。務必使用 InnoDB 叢集管理員帳戶或伺服器組態帳戶,使儲存在ClusterSet物件中的預設使用者帳戶具有正確的權限。例如mysql-js> \connect admin2@127.0.0.1:3310 Creating a session to 'admin2@127.0.0.1:3310' Please provide the password for 'admin2@127.0.0.1:3310': ******** Save password for 'admin2@127.0.0.1:3310'? [Y]es/[N]o/Ne[v]er (default No): Fetching schema names for autocompletion... Press ^C to stop. Closing old connection... Your MySQL connection id is 28 Server version: 8.0.27-commercial MySQL Enterprise Server - Commercial No default schema selected; type \use <schema> to set one. <ClassicSession:admin2@127.0.0.1:3310> mysql-js> myclusterset = dba.getClusterSet() <ClusterSet:testclusterset> -
在 MySQL Shell 中使用 AdminAPI 的
函式檢查整個部署的狀態。例如clusterSet.status()mysql-js> myclusterset.status({extended: 1})如需輸出說明,請參閱第 8.6 節,〈InnoDB ClusterSet 狀態與拓樸〉。
-
發出
命令,並命名您要重新加入 InnoDB ClusterSet 的叢集。例如clusterSet.rejoinCluster()mysql-js> myclusterset.rejoinCluster('clustertwo') Rejoining cluster 'clustertwo' to the clusterset NOTE: Cluster 'clustertwo' is invalidated * Updating metadata * Rejoining cluster ** Changing replication source of 127.0.0.1:4420 to 127.0.0.1:3310 ** Changing replication source of 127.0.0.1:4430 to 127.0.0.1:3310 ** Changing replication source of 127.0.0.1:4410 to 127.0.0.1:3310 Cluster 'clustertwo' was rejoined to the clusterset對於
命令clusterSet.rejoinCluster()clusterName參數是必要的,並指定在 InnoDB ClusterSet 中用於叢集的識別碼,如命令的輸出中所提供。在範例中,clusterSet.status()是正在重新加入的叢集名稱。clustertwo如果您想要在不實際執行變更的情況下執行驗證並記錄變更,請使用
dryRun選項。
當您發出
命令時,MySQL Shell 會檢查目標叢集是否符合重新加入 ClusterSet 的需求,如果不符合,則會傳回錯誤。如果目標叢集符合需求,MySQL Shell 會執行下列工作clusterSet.rejoinCluster()檢查 ClusterSet 複寫通道是否從目前的主要叢集複寫,如果尚未複寫,則會重新設定為執行此操作。
重新啟動 ClusterSet 複寫通道。
清除叢集的
INVALIDATED狀態。
目標叢集會以複本叢集的身分重新加入 InnoDB ClusterSet,即使之前是主要叢集也一樣。如果您想要讓目標叢集成為主要叢集,則需要進行受控切換。
請注意,如果您發出
命令時,目標叢集有成員未上線或無法連線,則該命令不會正確設定這些成員。如果您不再需要這些執行個體,可以使用clusterSet.rejoinCluster()命令移除它們。如果您修復這些執行個體或使其重新上線,請在這些成員返回叢集後再次發出cluster.removeInstance()命令。clusterSet.rejoinCluster() 再次使用
extended選項發出命令,以驗證 InnoDB ClusterSet 部署的狀態。clusterSet.status()如果您確實想要讓重新加入的叢集成為主要叢集,請發出
命令,並命名重新加入的叢集。第 8.7 節,〈InnoDB ClusterSet 受控切換〉包含該程序的指示,包括如何引導 MySQL Router 執行個體將流量傳送至新的主要叢集。clusterSet.setPrimaryCluster()