Documentation Home
MySQL 外壳 8.0  / 第 7 章 MySQL InnoDB 集群  / 7.10 升级InnoDB集群  /  7.10.2 InnoDB 集群升级故障排除

7.10.2 InnoDB 集群升级故障排除

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

处理主机名更改

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

对于使用 8.0.16 之前的 MySQL Shell 版本创建的集群,尝试从使用 8.0.16 或更高版本执行的完全中断中重启集群会导致此错误。这是由元数据值与实例报告的report_host 或值不匹配造成的。hostname解决方法是:

  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所有集群成员的值,以匹配集群创建时在元数据模式中注册的内容。