如果您需要修复 InnoDB ClusterSet 部署中的集群,请使用此信息。您可以在以下任何情况下使用此处的信息
InnoDB ClusterSet 中的集群需要维护,但其功能没有问题。
集群在 InnoDB ClusterSet 部署中运行正常,但存在一些问题,例如脱机的成员服务器。
集群运行不正常,需要修复。
集群在紧急故障转移或受控切换过程中被标记为失效。
章节 8.6,"InnoDB ClusterSet 状态和拓扑" 解释了如何检查 InnoDB 集群和整个 InnoDB ClusterSet 部署的状态,以及集群可能需要修复的情况。您可以在
命令的输出中识别以下情况clusterSet
.status()
集群没有法定人数(即,在线成员数量不足以构成多数)。
无法访问集群中的任何成员。
集群的 ClusterSet 复制通道已停止。
集群的 ClusterSet 复制通道配置错误。
集群的 GTID 集与 InnoDB ClusterSet 中主集群上的 GTID 集不一致。
集群已被标记为失效。如果集群仍然在线,该命令会警告您可能会出现脑裂情况。
如果集群是 InnoDB ClusterSet 部署中的主集群,在修复它之前,您可能需要执行受控切换或紧急故障转移以将其降级为副本集群。之后,您可以根据需要将集群脱机以进行修复,InnoDB ClusterSet 在此期间将保持可用。
如果主集群运行正常,但需要维护或存在轻微问题,则受控切换适用。运行正常的主集群在您使用
命令对其进行检查时具有全局状态clusterSet
.status()OK
。 章节 8.7,"InnoDB ClusterSet 受控切换" 解释了如何执行此操作。如果您根本无法联系主集群,则紧急故障转移适用。 章节 8.8,"InnoDB ClusterSet 紧急故障转移" 解释了如何执行此操作。
如果主集群运行不正常(全局状态为
NOT_OK
),但可以与其联系,请尝试使用本节中的信息修复任何问题。紧急故障转移存在丢失事务和为 InnoDB ClusterSet 创建脑裂情况的风险。如果您无法及时修复主集群以恢复可用性,请继续进行紧急故障转移,然后尽可能进行修复。
请按照以下步骤修复属于 InnoDB ClusterSet 部署一部分的 InnoDB 集群
-
使用 MySQL Shell,使用 InnoDB 集群管理员帐户(使用
创建)连接到主集群或副本集群中的任何成员服务器。您也可以使用 InnoDB 集群服务器配置帐户,它也具有所需的权限。建立连接后,使用cluster
.setupAdminAccount()dba.getClusterSet()
或
命令获取cluster
.getClusterSet()ClusterSet
对象。使用 InnoDB 集群管理员帐户或服务器配置帐户非常重要,以便存储在ClusterSet
对象中的默认用户帐户具有正确的权限。例如mysql-js> \connect [email protected]:4410 Creating a session to '[email protected]:4410' Please provide the password for '[email protected]:4410': ******** Save password for '[email protected]: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 42 Server version: 8.0.27-commercial MySQL Enterprise Server - Commercial No default schema selected; type \use <schema> to set one. <ClassicSession:[email protected]:4410> mysql-js> myclusterset = dba.getClusterSet() <ClusterSet:testclusterset>
-
使用 AdminAPI 的
命令在 MySQL Shell 中检查整个部署的状态。使用clusterSet
.status()extended
选项以查看问题的确切位置和内容。例如mysql-js> myclusterset.status({extended: 1})
有关输出的解释,请参见 章节 8.6,"InnoDB ClusterSet 状态和拓扑"。
-
仍然使用 InnoDB 集群管理员帐户(使用
创建)或 InnoDB 集群服务器配置帐户,使用cluster
.setupAdminAccount()dba.getCluster()
获取Cluster
对象。您可以连接到要修复的集群中的任何成员服务器,或者连接到 InnoDB ClusterSet 的任何成员,并使用name
参数在dba.getCluster()
上指定您想要的集群。例如mysql-js> cluster2 = dba.getClusterSet() <Cluster:clustertwo>
-
使用 AdminAPI 的
命令在 MySQL Shell 中检查集群的状态。使用cluster
.status()extended
选项以获取有关集群的更多详细信息。例如mysql-js> cluster2.status({extended: 2})
有关输出的解释,请参见 使用
检查集群状态。Cluster
.status() 在执行 紧急故障转移 后,如果存在事务集在 ClusterSet 部分之间不同的风险,则您必须从写入流量或所有流量中隔离集群。 章节 8.9.1,"在 InnoDB ClusterSet 中隔离集群" 解释了如何从 MySQL Shell 8.0.28 开始隔离和取消隔离集群。
如果集群上的事务集 (GTID 集) 不一致,请先修复它。如果副本集群的 GTID 集与 InnoDB ClusterSet 中主集群上的 GTID 集不一致,
命令会发出警告。处于此状态的副本集群具有全局状态clusterSet
.status()OK_NOT_CONSISTENT
。您还需要检查在受控切换或紧急故障转移过程中被标记为失效的前主集群或副本集群的 GTID 集。与 ClusterSet 中其他集群相比具有额外事务的集群可以在其保持活动状态的同时继续在 ClusterSet 中正常运行。但是,具有额外事务的集群无法重新加入 ClusterSet。 章节 8.9.2,"InnoDB ClusterSet 集群中的不一致事务集 (GTID 集)" 解释了如何检查和解决服务器上的事务问题。如果集群中的成员服务器或集群的整体成员资格 (例如,容错能力不足或法定人数丢失) 存在技术问题,您可以与各个成员服务器协作或调整集群成员资格以解决此问题。 章节 8.9.3,"修复 InnoDB ClusterSet 中的成员服务器和集群" 解释了哪些操作可用于处理集群中的成员服务器。
如果您无法修复集群,可以使用
命令将其从 InnoDB ClusterSet 中删除。有关如何执行此操作的说明,请参见 章节 8.9.4,"从 InnoDB ClusterSet 中删除集群"。已删除的 InnoDB 集群无法添加回 InnoDB ClusterSet 部署中。如果您想再次使用部署中的服务器实例,您将需要使用它们设置一个新集群。clusterSet
.removeCluster()修复集群或执行完所需的维护后,可以使用
命令将其重新加入 InnoDB ClusterSet。此命令将验证集群是否能够重新加入,更新并启动 ClusterSet 复制通道,并从集群中删除任何失效状态。有关如何执行此操作的说明,请参见 章节 8.9.5,"将集群重新加入 InnoDB ClusterSet"。clusterSet
.rejoin()