对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
系统变量设置了空值,则会生成错误。(缺陷#28285389)
对于使用早于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
所有集群成员的值,以匹配创建集群时已在元数据模式中注册的内容。