如果 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()