• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 对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_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所有集群成员的值,以匹配创建集群时已在元数据模式中注册的内容。