下载本手册
PDF(US Ltr) - 2.3Mb
PDF(A4) - 2.3Mb


MySQL Shell 9.0  /  ...  /  InnoDB Cluster 升级故障排除

7.10.2 InnoDB Cluster 升级故障排除

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

处理主机名更改

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 的值,使其与创建集群时在元数据架构中注册的值相匹配。