如果 InnoDB 叢集是 InnoDB ClusterSet 部署的一部分,MySQL Shell 會在重新啟動後自動將其還原至拓樸中的角色,前提是其功能可接受且未標示為無效。但是,如果叢集已標示為無效或其 ClusterSet 複寫通道已停止,您必須使用
作業才能將其重新加入 InnoDB ClusterSet 部署。clusterSet
.rejoinCluster()
作業會驗證目標叢集是否符合下列需求:clusterSet
.rejoinCluster()
該叢集先前是 ClusterSet 的成員。
該叢集具有仲裁 (有足夠的成員在線上形成多數)。
可連線到該叢集的主要伺服器。
該叢集未持有任何中繼資料鎖定或 InnoDB 交易鎖定。
該叢集的 GTID 集 (
gtid_executed
) 與 ClusterSet 的作用中成員相比,沒有額外的交易,檢視變更事件除外。這些群組複寫內部交易是由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()