本节介绍升级过程的故障排除。
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_host
或 hostname
值不匹配。解决方法是
确定哪些实例是 “种子”,换句话说,具有最新 GTID 的实例。
dba.rebootClusterFromCompleteOutage()
操作会检测实例是否是种子,如果当前会话未连接到最新实例,则操作会生成错误。-
将
report_host
系统变量设置为存储在元数据模式中用于目标实例的值。此值是创建集群时实例定义中使用的hostname:port
对。可以通过查询mysql_innodb_cluster_metadata.instances
表来查看该值。例如,假设使用以下命令序列创建了一个集群
mysql-js> \c clusterAdmin@localhost:3306 mysql-js> dba.createCluster("myCluster")
因此存储在元数据中的主机名值为 “localhost”,因此,必须将
report_host
设置为种子上的 “localhost”。 仅使用种子实例重启集群。在交互式提示符中,不要将剩余实例添加到集群中。
使用
将其他实例添加回集群。Cluster
.rescan()从集群中删除种子实例
停止种子实例上的 mysqld,并删除强制
report_host
设置(步骤 2),或将其替换为之前存储在元数据值中的值。重新启动种子实例,并使用
将其添加回集群。Cluster
.addInstance()
这使得能够将集群平稳且完整地升级到最新的 MySQL Shell 版本。另一种可能性取决于用例,是简单地将所有集群成员上的 report_host
的值设置为与创建集群时注册在元数据模式中的值匹配。