6.2.7 innodb集群故障排除

介绍InnoDB集群的故障处理方法。

重新加入实例到集群

如果一个实例离开群集,例如因为它丢失了连接,而出于某种原因它无法自动重新加入群集,可能需要在稍后阶段将其重新加入群集。将一个实例重新加入群集问题。一突密(实例)

提示

如果实例具有super_read_only =对然后,您可能需要确认adminapi可以设置super_read_only =了。看超级只读和实例想要查询更多的信息。

在实例未持久的情况下(参见持久的设置),在重新启动时,实例不会自动重新加入集群。解决办法是发布cluster.rejoininstance()因此,实例再次添加到群集,并确保更改持久。InnoDB群集配置持续到实例的选项文件,它会自动重新加入群集。

如果要重新加入以某种方式更改的实例,那么您可能必须修改实例以使重新加入进程正常工作。例如,当您还原MySQL Enterprise Backup Backup时,server_uuid.变化。尝试重新加入这样的实例失败,因为InnoDB群集实例由server_uuid.多变的。在这样的情况下,有关实例的旧信息server_uuid.必须从InnoDB群集元数据中删除,然后是一个.rescan()必须执行以使用新实例将该实例添加到元数据中server_uuid.。例如:

集群。removeInstance("root@instanceWithOldUUID:3306", {force: true}) cluster.rescan()

在这种情况下,您必须通过力量选择.RemoveInstance()方法,因为实例从群集的角度无法访问,我们希望从InnoDB群集元数据中删除它。

从仲裁丢失中恢复集群

如果实例(或实例)失败,则群集可能会失去其仲裁,这是在新的主要主机中投票的能力。当存在足够的情况时,这可能发生在不再有大多数实例中,该实例构成了群集对组复制操作进行投票。看容错。当群集失去Quorum时,您无法再使用群集进行写入事务,或者更改群集的拓扑,例如通过添加,重新加入或删除实例。但是如果您在线包含包含InnoDB群集元数据的实例,则可以使用仲裁还原群集。这假设您可以连接到包含InnoDB群集元数据的实例,并且该实例可以联系要用于还原群集的其他实例。

重要的

这种操作可能是危险的,因为如果使用错误,如果使用,它可以创建分裂性方案,并且应该被视为最后的手段。绝对确定此组中没有此组的分区仍然在网络中的某处运行,但无法从您的位置访问。

连接到包含集群元数据的实例,然后使用.ForcequorumusingPartitionof(实例)操作,基于元数据恢复群集实例,然后是所有的实例在线的从给定的实例定义,将添加到恢复的群集中。

mysql-js> cluster. forcequorumusingpartitionof ("icadmin@ic-1:3306") Restoring replicasset 'default' from loss of quorum, by using the partition composed of [icadmin@ic-1:3306] Please provide the password for 'icadmin@ic-1:3306': ****** Restoring the InnoDB cluster…InnoDB集群使用实例“icadmin@ic-1:3306”的分区成功恢复。警告:要避免脑裂的情况,请确保复制集的所有其他成员都被删除或加入到已恢复的组中。

如果实例未自动添加到群集,例如如果其设置未持久,请使用.rejoinInstance ()手动将实例添加回集群。

恢复的群集可能不会,不必包含构成群集的所有原始实例。例如,如果原始群集由以下五个实例组成:

  • ic-1

  • ic-2

  • ic-3

  • ic-4

  • ic-5

而且聚类经历了一个分裂的大脑情景ic-1,ic-2, 和ic-3形成一个分区ic-4ic-5形成另一个分区。如果你连接到ic-1和问题.ForcequorumusingPartitionof('icadmin @ IC-1:3306')为了恢复集群,生成的集群将包括以下三个实例:

  • ic-1

  • ic-2

  • ic-3

因为ic-1看到ic-2ic-3作为在线的却看不见ic-4ic-5

从重大中断重新启动集群

如果您的集群遭受了完全的停机,您可以确保使用正确地重新配置它dba.rebootclusterfromcompleteoutage()。此操作采用MySQL Shell当前连接的实例并使用其元数据来恢复群集。如果群集的实例完全停止,则必须启动实例,只能启动群集。例如,如果重新启动机器Sandbox群集运行Sandbox群集,则该实例位于Ports 3310,3320和3330,问题:

mysql-js> dba.startSandboxInstance(3310) mysql-js> dba.startSandboxInstance(3320)

这可确保沙盒实例正在运行。在生产部署的情况下,您必须启动MySQL shell之外的实例。一旦实例启动,您需要连接到具有GTID超集的实例,这意味着在中断之前应用了大多数事务的实例。如果您不确定包含GTID超集的实例,请连接到任何实例并按照交互式消息dba.rebootclusterfromcompleteoutage()操作,它检测您所连接的实例是否包含GTID超集。通过发出以下命令重新启动集群:

mysql-js> var cluster = dba.rebootClusterFromCompleteOutage();

dba.rebootclusterfromcompleteoutage()然后,操作执行以下步骤以确保群集正确重新配置:

  • 在MySQL Shell当前连接的实例上找到的InnoDB集群元数据被检查是否包含GTID超集,换句话说,就是集群应用的事务。如果当前连接的实例不包含GTID超集,操作将使用该信息中止。有关更多信息,请参见后面的段落。

  • 如果实例包含GTID uperset,则基于实例的元数据恢复群集。

  • 假设您正在交互模式下运行MySQL Shell,将运行一个向导,检查集群的哪些实例当前是可访问的,并询问您是否希望将任何已发现的实例重新加入到重新引导的集群中。

  • 类似地,在交互模式下,向导还会检测当前不可达的实例,并询问您是否希望从重新启动的集群中删除此类实例。

如果您不使用MySQL Shell的交互模式,则可以使用rejoinInstancesremoveInstances.手动配置应在群集重新启动期间应加入或删除的实例的选项。

如果您遇到错误,例如与群集元数据的在线实例相比,活动会话实例不是最新的。然后,您连接的实例没有群集应用的GTID超集。在这种情况下,将MySQL Shell连接到错误消息和问题中建议的实例dba.rebootclusterfromcompleteoutage()从那个例子。

提示

要手动检测哪个实例具有GTID超集而不是使用交互式向导,请检查gtid_execute每个实例上的变量。例如问题:

MySQL-SQL>显示“GTID_EXECUTE”等变量;

应用最大的实例GTID集事务包含GTID超集。

如果此过程失败,并且群集元数据变得严重损坏,则可能需要删除元数据并再次从头开始创建群集。您可以使用群集元数据使用dba.dropmetadataschema()

警告

dba.dropmetadataschema()方法只能用作最后一个手段,当无法恢复群集时。它无法撤消。

如果你在集群中使用MySQL路由器,当你删除元数据时,所有当前的连接都会被删除,新的连接也会被禁止。这将导致全面停机。

重新扫描一个集群

如果您在AdminAPI命令之外对集群进行配置更改,例如手动更改实例的配置以解决配置问题,或者在实例丢失之后,您需要更新InnoDB cluster元数据,使其与实例的当前配置匹配。在这些情况下,使用.rescan()操作,使您可以手动或使用交互式向导更新InnoDB群集元数据。的.rescan()操作可以检测未在元数据中注册的新活动实例,并添加它们,或者仍在元数据中注册的过时实例(不再活动),然后删除它们。您可以根据命令发现的实例自动更新元数据,或者您可以指定要为元数据添加到元数据或从元数据中删除的实例地址列表。您还可以更新存储在元数据中的拓扑模式,例如在从单程模式下更改为管理员外部的多主模式。

命令格式为.rescan([选项])。的选项Dictionary支持以下功能:

  • 交互的:布尔值,用于命令执行时禁用或启用向导。控制是否提供提示和确认。默认值等于MySQL Shell向导模式,由shell.options.usewizards.

  • addInstances.:列出新的活动实例的连接数据,以添加到元数据,或汽车将丢失的实例自动添加到元数据中。的值汽车不区分大小写。

    • 列表中指定的实例被添加到元数据,而不提示确认

    • 在交互模式下,系统将提示您确认添加新发现的实例不包括在内addInstances.选项

    • 在非交互模式下,新发现的实例不包括在addInstances.选项将在输出中报告,但不会提示您添加它们

  • removeInstances.:列表与过时的实例的连接数据从元数据中删除,或汽车自动从元数据中删除过时的实例。

    • 列表中指定的实例从元数据中删除,而不提示确认

    • 在交互模式中,系统将提示您确认删除不包括在removeInstances.选项

    • 在非交互模式中,未包括在removeInstances.选项将报告在输出中,但不会提示您删除它们

  • UpdateTopologyMode.:用于指示元数据中的拓扑模式(单程或多主机)是否应该更新(true)(false)以匹配群集使用的拓扑模式(false)。默认情况下,未更新元数据(false)。

    • 如果值为真的然后将InnoDB群集元数据与组复制使用的当前模式进行比较,并且在必要时更新元数据。使用此选项可在adminapi之外更改群集的拓扑模式后更改元数据。

    • 如果值为错误的那么InnoDB集群的元数据关于集群的拓扑模式不会更新,即使它不同于集群的组复制组使用的拓扑

    • 如果未指定选项,并且元数据中的拓扑模式与群集组复制组使用的拓扑不同,则:

      • 在交互模式下,提示确认元数据中拓扑模式的更新

      • 在非交互模式下,如果群集的组复制组和innodb群集元数据使用的拓扑之间存在差异,则报告并没有对元数据进行更改

    • 更新元数据拓扑模式以匹配组复制模式时,所有实例上的自动增量设置都会如上所述更新InnoDB集群和自动增量