本节介绍升级过程中的故障排除。
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
的值,使其与创建集群时在元数据架构中注册的值相匹配。