MySQL Shell 8.4  /  ...  /  InnoDB 集群升级故障排除

7.10.2 InnoDB 集群升级故障排除

本节介绍升级过程的故障排除。

处理主机名更改

MySQL Shell 使用提供的连接参数的主机值作为用于 AdminAPI 操作的目标主机名,即在元数据中注册实例(对于 dba.createCluster()Cluster.addInstance() 操作)。但是,用于连接参数的实际主机可能与群组复制使用的 hostname 不匹配,群组复制在定义 report_host 系统变量时使用该变量的值(换句话说,它不是 NULL),否则使用 hostname 的值。因此,AdminAPI 现在遵循相同的逻辑在元数据中注册目标实例,并作为 group_replication_local_address 变量在实例上的默认值,而不是使用实例连接参数中的主机值。当 report_host 变量设置为空时,群组复制对主机使用空值,但 AdminAPI(例如在 dba.checkInstanceConfiguration()dba.configureInstance()dba.createCluster() 等命令中)报告主机名作为使用的值,这与群组复制报告的值不一致。如果将 report_host 系统变量设置为空值,则会生成错误。

对于使用早于 8.0.16 的 MySQL Shell 版本创建的集群,尝试使用 8.0.16 或更高版本从完全故障中重启集群会导致此错误。这是因为元数据值与群组复制报告的 report_hosthostname 值不匹配。解决方法是

  1. 确定哪些实例是 种子,换句话说,具有最新 GTID 的实例。 dba.rebootClusterFromCompleteOutage() 操作会检测实例是否是种子,如果当前会话未连接到最新实例,则操作会生成错误。

  2. report_host 系统变量设置为存储在元数据模式中用于目标实例的值。此值是创建集群时实例定义中使用的 hostname:port 对。可以通过查询 mysql_innodb_cluster_metadata.instances 表来查看该值。

    例如,假设使用以下命令序列创建了一个集群

    mysql-js> \c clusterAdmin@localhost:3306
    mysql-js> dba.createCluster("myCluster")

    因此存储在元数据中的主机名值为 localhost,因此,必须将 report_host 设置为种子上的 localhost

  3. 仅使用种子实例重启集群。在交互式提示符中,不要将剩余实例添加到集群中。

  4. 使用 Cluster.rescan() 将其他实例添加回集群。

  5. 从集群中删除种子实例

  6. 停止种子实例上的 mysqld,并删除强制 report_host 设置(步骤 2),或将其替换为之前存储在元数据值中的值。

  7. 重新启动种子实例,并使用 Cluster.addInstance() 将其添加回集群。

这使得能够将集群平稳且完整地升级到最新的 MySQL Shell 版本。另一种可能性取决于用例,是简单地将所有集群成员上的 report_host 的值设置为与创建集群时注册在元数据模式中的值匹配。