MySQL Shell 8.4  /  ...  /  從 InnoDB ClusterSet 移除叢集

8.9.4 從 InnoDB ClusterSet 移除叢集

如果您無法修復叢集,可以使用 clusterSet.removeCluster() 命令從 InnoDB ClusterSet 中移除它。如果完全無法連線到叢集,則可以使用 force 選項。

重要

InnoDB ClusterSet 中的主要叢集無法使用此命令移除。如果您確實需要移除主要叢集,您必須先執行受控切換(請參閱第 8.7 節,「InnoDB ClusterSet 受控切換」)或緊急容錯移轉(請參閱第 8.8 節,「InnoDB ClusterSet 緊急容錯移轉」),將主要叢集降級為複本叢集,並將其中一個複本叢集升級為主要叢集。之後,即可使用此程序移除先前的主要叢集。

移除的 InnoDB 叢集無法重新加入 InnoDB ClusterSet 部署。如果您想再次使用部署中的伺服器執行個體,您將需要使用它們設定新的叢集。

若要從 InnoDB ClusterSet 移除叢集,請依照下列步驟操作

  1. 使用 MySQL Shell,使用 InnoDB 叢集管理員帳戶(使用 cluster.setupAdminAccount() 建立)連線至主要叢集或其中一個複本叢集中的任何成員伺服器。您也可以使用 InnoDB 叢集伺服器組態帳戶,該帳戶也具有所需的權限。連線建立後,使用 dba.getClusterSet()cluster.getClusterSet() 命令取得 ClusterSet 物件。務必使用 InnoDB 叢集管理員帳戶或伺服器組態帳戶,以便儲存在 ClusterSet 物件中的預設使用者帳戶具有正確的權限。例如

    mysql-js> \connect admin2@127.0.0.1:4410
    Creating a session to 'admin2@127.0.0.1:4410'
    Please provide the password for 'admin2@127.0.0.1:4410': ********
    Save password for 'admin2@127.0.0.1:4410'? [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 33
    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:4410>
    mysql-js> myclusterset = dba.getClusterSet()
    <ClusterSet:testclusterset>
  2. 使用 MySQL Shell 中 AdminAPI 的 clusterSet.status() 函式檢查整個部署的狀態。例如

    mysql-js> myclusterset.status({extended: 1})

    如需輸出說明的說明,請參閱第 8.6 節,「InnoDB ClusterSet 狀態與拓撲」

    當您發出 clusterSet.removeCluster() 命令時,InnoDB ClusterSet 部署中必須有一個作用中且可連線的主要叢集,而且這不能是您正在移除的叢集。您正在移除的叢集目前必須具有複本叢集的狀態。它可以是失效的,而且不一定要可連線。

  3. 藉由在連線至 InnoDB ClusterSet 部署中的任何成員伺服器時,在 MySQL Shell 中發出 clusterSet.routingOptions(),檢查為每個 MySQL Router 執行個體設定的路由選項,以及 InnoDB ClusterSet 部署的全域策略。確認沒有任何 MySQL Router 執行個體將流量路由至您要移除的叢集。如果有的話,您必須使用 clusterSet.setRoutingOption() 命令將其設定變更為將流量路由至另一個叢集,如第 8.5 節,「將 MySQL Router 與 InnoDB ClusterSet 整合」中所述。如果 InnoDB ClusterSet 部署已知的任何 MySQL Router 執行個體將流量路由至叢集,則無法移除該叢集。

  4. 發出 clusterSet.removeCluster() 命令,命名您要從 InnoDB ClusterSet 移除的叢集。例如

    mysql-js> myclusterset.removeCluster('clusterone')
    The Cluster 'clusterone' will be removed from the InnoDB ClusterSet.
    
    * Waiting for the Cluster to synchronize with the PRIMARY Cluster...
    ** Transactions replicated  ############################################################  100% 
    * Updating topology
    ** Transactions replicated  ############################################################  100% 
    * Stopping and deleting ClusterSet managed replication channel...
    
    The Cluster 'clusterone' was removed from the ClusterSet.
    • clusterName 參數為必要參數,並指定叢集在 InnoDB ClusterSet 中使用的識別碼,如 clusterSet.status() 命令的輸出中所提供。在此範例中,clusterone 是要移除的叢集。

    • 如果您想要執行驗證並記錄變更,而無需實際執行這些變更,請使用 dryRun 選項。

    • 使用 timeout 選項指定等待叢集與 InnoDB ClusterSet 中的主要叢集同步的最長秒數。

    • 當叢集的主要執行個體無法連線時,請使用 force 選項從 ClusterSet 移除叢集。

    當您發出 clusterSet.removeCluster() 命令時,MySQL Shell 會檢查 InnoDB ClusterSet 部署中的主要叢集是否可連線、目標叢集是否不是主要叢集,以及是否沒有任何 MySQL Router 執行個體將流量路由至目標叢集。如果未滿足任何這些條件,則會傳回錯誤。如果滿足這些條件,MySQL Shell 會執行下列工作,以從 InnoDB ClusterSet 中移除目標叢集

    • 捨棄在目標叢集上為 ClusterSet 複寫通道建立的複寫使用者。

    • 將目標叢集的主要伺服器與 InnoDB ClusterSet 的主要叢集同步,並等待所有交易在本地套用。如果逾時在完成此作業之前到期,則作業會失敗。如果同步處理不起作用,請使用 force 選項重試。

    • 停止 ClusterSet 複寫通道,然後移除通道並將其組態重設為預設值。

    • 從 InnoDB ClusterSet 中繼資料移除目標叢集的中繼資料和成員資訊。

    • 在所有成員伺服器上設定 super_read_only 系統變數,以確保不會對它們執行任何更新。

  5. 再次使用 extended 選項發出 clusterSet.status() 命令,以驗證 InnoDB ClusterSet 部署的狀態。

  6. 移除的 InnoDB 叢集無法重新加入 InnoDB ClusterSet 部署,因此如果您想要再次使用部署中的伺服器執行個體,您將需要使用獨立執行個體設定新的叢集。InnoDB 叢集會在移除程序期間隱含解散,以便所有成員都變成獨立執行個體。

    請注意,群組複寫組態不會從伺服器執行個體中移除,因此在 InnoDB ClusterSet 部署中重新使用這些執行個體時,應謹慎行事,如第 8.1 節,「InnoDB ClusterSet 需求」中所述。由於執行個體是針對 InnoDB ClusterSet 部署設定的,因此發生問題的可能性較低,但您應該注意組態差異的可能性,尤其是在不同的 InnoDB ClusterSet 部署中重複使用執行個體時。