如果无法修复集群,可以使用 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 服务器配置帐户,该帐户也具有所需的权限。建立连接后,使用 dba.getClusterSet() 或 cluster.getClusterSet() 命令获取 ClusterSet 对象。使用 InnoDB Cluster 管理员帐户或服务器配置帐户非常重要,以便存储在 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>
  1. 使用 MySQLShell 中 AdminAPI 的 clusterSet.status() 函数检查整个部署的状态。例如:
mysql-js> myclusterset.status({extended: 1})

有关输出的说明,请参阅 8.6 InnoDB ClusterSet 的状态和拓扑 。

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

  1. 当连接到 InnoDB ClusterSet 部署中的任何成员服务器时,通过在 MySQL Shell 中发出 clusterSet.routingOptions() , 检查为每个 MySQL Router 实例设置的路由选项以及 InnoDB ClusterSet 部署的全局策略。验证没有 MySQL 路由器实例将流量路由到要删除的集群。如果有,您必须使用 clusterSet.setRoutingOption() 命令更改其设置,以将流量路由到另一个集群,如 8.5 将 MySQL Router 与 InnoDB ClusterSet 集成 所述。如果 InnoDB ClusterSet 部署已知的任何 MySQL 路由器实例正在将流量路由到集群,则无法删除该集群。
  2. 发出 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 系统变量设置,以确保不对其执行更新。
  1. 使用 extended 选项再次执行 clusterSet.status() 命令,以验证 InnoDB clusterSet 部署的状态。
  2. 删除的 InnoDB Cluster 无法添加回 InnoDB ClusterSet 部署中,因此如果您想再次在部署中使用服务器实例,则需要使用独立实例设置新的集群。从 MySQLShell 8.0.28 中,InnoDB Cluster 在删除过程中被隐式解散,因此所有成员都成为独立实例。在 MySQL Shell 8.0.27 中,按照 “解散 InnoDB 集群” 中的说明手动解散集群。请注意,组复制配置并未从服务器实例中删除,因此在 InnoDB ClusterSet 部署中重用这些配置时应谨慎,如 8.1 InnoDB ClusterSet 的要求 所述。由于实例是为 InnoDB ClusterSet 部署配置的,因此出现问题的可能性较低,但您应该意识到配置差异的可能性,尤其是在不同的 InnoDB ClusterSet 部署中重用实例时。