MySQL Shell 9.0  /  ...  /  在 InnoDB ClusterSet 中修复成员服务器和集群

8.9.3 在 InnoDB ClusterSet 中修复成员服务器和集群

根据集群的问题或维护要求,您可以使用以下操作来处理其成员服务器。除非另有说明,否则请使用您使用 InnoDB 集群管理员帐户或服务器配置帐户获取的 ClusterClusterSet 对象,以便存储在 ClusterSet 对象中的默认用户帐户具有正确的权限。

  • 使用 cluster.addInstance() 命令将更多服务器实例添加到集群中,如 第 8.4 节,“部署 InnoDB ClusterSet” 中的过程所述。有关该命令的更多详细信息,请参阅 第 7.4.4 节,“将实例添加到 InnoDB 集群”

    请注意,对于此操作,您需要使用 InnoDB 集群服务器配置帐户和使用该帐户获取的 Cluster 对象。该帐户还必须存在于服务器实例上,如 第 8.3 节,“InnoDB ClusterSet 的用户帐户” 中所述。

    当您使用此命令将成员服务器添加到作为 InnoDB ClusterSet 部署的一部分的 InnoDB 集群时,服务器实例将添加到集群中,并使用 InnoDB ClusterSet 的数据进行配置。ClusterSet 复制通道在实例上设置,并应用在 InnoDB ClusterSet 部署中运行所需的配置。

  • 使用 cluster.rejoinInstance() 命令重新加入以前是集群的一部分但无法自动重新加入集群的服务器实例。有关此操作的详细信息,请参阅 第 7.8.1 节,“将实例重新加入集群”

    当您使用此命令将成员服务器重新加入到作为 InnoDB ClusterSet 部署的一部分的 InnoDB 集群时,服务器实例将重新加入集群,并使用 InnoDB ClusterSet 的数据进行配置。ClusterSet 复制通道在实例上设置,并应用在 InnoDB ClusterSet 部署中运行所需的配置。

  • 使用 cluster.removeInstance() 命令从集群中移除服务器实例。指定要移除的服务器实例的主机名和端口号。有关此操作的详细信息,请参阅从 InnoDB 集群中移除实例。可以使用 force 选项,但这只能作为最后的手段。

    当您在 InnoDB ClusterSet 部署中的成员服务器上使用此命令时,MySQL Shell 将重置为 InnoDB ClusterSet 应用的所有配置,并重置 ClusterSet 复制通道设置。

  • 使用 cluster.setPrimaryInstance(instance) 命令将集群的主节点更改为另一个成员服务器。更改主节点允许您在当前主服务器上执行维护和升级,或者在组复制自身的选举过程没有自动选举您想要的主服务器时选择一个主服务器。

    指定要作为主节点的服务器实例的主机名和端口号。您可以使用 runningTransactionsTimeout 选项为使用该函数时正在运行的事务指定 0 到 3600 秒之间的超时时间,该函数还会停止新的传入事务。超时没有默认设置,因此如果您没有设置它,则操作的等待时间没有上限,并且新事务可以在该时间内启动。

    当您在 InnoDB ClusterSet 部署中的成员服务器上使用此命令时,MySQL Shell 会事先停止服务器上的 ClusterSet 复制通道,并在之后重新启动它。此外,如果集群是副本集群,MySQL Shell 会将主节点保持为只读状态,而不是像 InnoDB 集群的主节点那样将其设为读写状态。

  • 使用 cluster.forceQuorumUsingPartitionOf(instance) 命令,通过强制剩余实例的法定数量来恢复已丢失法定数量的集群。使用正确的元数据指定在线服务器实例的主机名和端口号。该操作使集群由该实例和其他可访问的实例组成,并排除已分区实例。此操作可能会创建脑裂场景,因此应将其视为最后的手段。有关此操作的详细信息,请参阅 第 7.8.2 节,“从法定数量丢失中恢复集群”

    当您在 InnoDB ClusterSet 部署中的成员服务器上使用此命令时,MySQL Shell 会检查目标集群是否仍然是 ClusterSet 的有效部分,如果不是,则会向您发出警告。它还会在此操作后自动重新启动 ClusterSet 复制通道。如果集群是副本集群,MySQL Shell 会将主节点保持为只读状态,而不是像 InnoDB 集群的主节点那样将其设为读写状态。

  • 使用 dba.rebootClusterFromCompleteOutage() 命令重新启动完全脱机的集群。有关此操作的详细信息,请参阅 第 7.8.3 节,“从重大故障中重新启动集群”

    当您在 InnoDB ClusterSet 部署中的成员服务器上使用此命令时,MySQL Shell 会检查目标集群是否仍然是 ClusterSet 的有效部分,如果不是,则会向您发出警告。

    如果集群未失效,MySQL Shell 会在重新启动后立即将其重新加入到 InnoDB ClusterSet 部署中。如果集群已失效,则必须使用 clusterSet.rejoinCluster() 操作将其重新加入到 InnoDB ClusterSet 部署中。有关操作说明,请参阅 第 8.9.5 节,“将集群重新加入到 InnoDB ClusterSet”

    MySQL Shell 还会在此操作后自动重新启动 ClusterSet 复制通道。如果集群是副本集群,MySQL Shell 会将主节点保持为只读状态,而不是像 InnoDB 集群的主节点那样将其设为读写状态。

您不能解散当前是 InnoDB ClusterSet 部署的一部分的 InnoDB 集群,除非它是 ClusterSet 中唯一的集群或该集群已失效。在所有其他配置中,您必须将其从 InnoDB ClusterSet 中移除,如 第 8.9.4 节,“从 InnoDB ClusterSet 中移除集群” 中所述。

如果集群是 ClusterSet 中唯一的集群或该集群已失效,则可以在该集群上使用 dba.dropMetadataSchema()cluster.dissolve()