Documentation Home
MySQL 外壳 8.0  / 第 8 章 MySQL InnoDB ClusterSet  / 8.9 InnoDB ClusterSet修复和重新加入  /  8.9.4 从 InnoDB ClusterSet 中删除一个 Cluster

8.9.4 从 InnoDB ClusterSet 中删除一个 Cluster

如果无法修复集群,可以使用 clusterSet.removeCluster() 命令将其从 InnoDB ClusterSet 中删除。force如果根本无法联系集群,则可以使用 一个选项。

重要的

无法使用此命令删除 InnoDB ClusterSet 中的主集群。如果确实需要删除主集群,则必须首先执行受控切换(请参阅 第 8.7 节,“InnoDB ClusterSet 受控切换”)或紧急故障转移(请参阅 第 8.8 节,“InnoDB ClusterSet 紧急故障转移”)以降级主集群集群到副本集群,并将其中一个副本集群提升为主集群。之后,可以使用此过程删除以前的主集群。

无法将已删除的 InnoDB Cluster 添加回 InnoDB ClusterSet 部署。如果要在部署中再次使用服务器实例,则需要使用它们设置一个新集群。

要从 InnoDB ClusterSet 中删除集群,请遵循以下过程:

  1. 使用 MySQL Shell,使用 InnoDB Cluster 管理员帐户(使用创建 cluster.setupAdminAccount())连接到主集群或其中一个副本集群中的任何成员服务器。您还可以使用 InnoDB Cluster 服务器配置帐户,该帐户也具有所需的权限。建立连接后, 使用或 命令获取ClusterSet对象 。使用 InnoDB Cluster 管理员帐户或服务器配置帐户很重要,这样存储在 对象中的默认用户帐户具有正确的权限。例如: dba.getClusterSet()cluster.getClusterSet()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. clusterSet.status() 使用MySQL Shell 中 的 AdminAPI 函数检查整个部署的状态 。例如:

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

    有关输出的解释,请参阅 第 8.6 节,“InnoDB ClusterSet 状态和拓扑”

    当您发出 clusterSet.removeCluster() 命令时,InnoDB ClusterSet 部署中必须有一个活动且可访问的主集群,并且这不能是您要删除的集群。您要删除的集群当前必须具有副本集群的状态。它可以无效,并且不必可达。

  3. 检查为每个 MySQL Router 实例设置的路由选项,以及 InnoDB ClusterSet 部署的全局策略,方法是 clusterSet.routingOptions() 在连接到 InnoDB ClusterSet 部署中的任何成员服务器时在 MySQL Shell 中发出。确认没有 MySQL Router 实例将流量路由到您要删除的集群。如果有,您必须更改它们的设置以使用 clusterSet.setRoutingOption() 命令将流量路由到另一个集群,如 第 8.5 节“将 MySQL 路由器与 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. 使用该选项再次发出 clusterSet.status() 命令extended,以验证 InnoDB ClusterSet 部署的状态。

  6. 删除的 InnoDB Cluster 无法添加回 InnoDB ClusterSet 部署,因此如果您想再次在部署中使用服务器实例,则需要使用独立实例设置新集群。从 MySQL Shell 8.0.28 开始,InnoDB Cluster 在删除过程中被隐式解散,因此所有成员都成为独立实例。在 MySQL Shell 8.0.27 中,按照 Dissolving an InnoDB Cluster中的说明手动解散集群。

    请注意,组复制配置不会从服务器实例中删除,因此在 InnoDB ClusterSet 部署中重用这些配置时应谨慎行事,如 第 8.1 节“InnoDB ClusterSet 要求”中所述。由于实例是为 InnoDB ClusterSet 部署配置的,因此出现问题的可能性较低,但您应该意识到配置差异的可能性,尤其是当实例在不同的 InnoDB ClusterSet 部署中重用时。