如何解决innodb集群冲突

Yen*_*Yen 2 mysql innodb mysql-innodb-cluster

我目前正在维护一个具有三个节点的 innodb 集群。它运行良好,但有时会出现一个节点,MISSING然后我必须将其重新上线。

问题是我插入了一个没有主键的表。然后一个节点失败了。当我想将故障节点重新加入集群时,它说它无法加入,因为有一个没有主键的表。我更改了集群中的表以为其提供主键,但故障节点仍然抱怨相同。所以我删除了故障节点中的表并期望它会重建该表。

现在它说

ERROR: Group Replication join failed.
ERROR: Error joining instance to cluster: '192.168.123.45@3306' - Query failed. 3092 (HY000): The server is not configured properly to be an active member of the group. Please see more details on error log.. Query: START group_replication (RuntimeError)
Run Code Online (Sandbox Code Playgroud)

在我运行 cluster.checkInstanceState('root@192.168.123.45:3306'); 后

The instance '192.168.123.45:3306' is invalid for the cluster.
The instance contains additional transactions in relation to the cluster.

{
    "reason": "diverged", 
    "state": "error"
}
Run Code Online (Sandbox Code Playgroud)

我知道这是因为不同数据库中的状态不一致。但是我搜索了互联网,但没有关于如何解决 innodb 集群冲突的文档。任何意见将是有益的!

Rat*_*r B 6

我最近已经解决了这个问题,步骤如下:

我尝试将实例重新加入集群,如下所示:

cluster.rejoinInstance(instance);
Run Code Online (Sandbox Code Playgroud)

现在该cluster.status()函数报告成员状态“RECOVERING”,但几分钟后,它再次报告为“MISSING”

我已登录到丢失的实例并验证了进程列表SHOW FULL PROCESSLIST;,但我看不到任何活动流量,并且我通过查询几个用户表来验证数据不一致。

此外,通过功能检查集群状态cluster.status({extended:true, queryMembers:true});并观察到,lastApplied块并startTimestamp显示较旧的日期,这确认最近的事务未应用于此实例。

然后,我执行了以下步骤从集群中删除实例:

cluster.removeInstance(instance);
Run Code Online (Sandbox Code Playgroud)

并添加回实例,如下所示:

cluster.removeInstance(instance);
Run Code Online (Sandbox Code Playgroud)

这产生了错误:The instance is already part of the another Group Replication;

因此,我查询了下表中丢失的实例,并再次找出了实例状态:

select * from performance_schema.replication_group_members;
Run Code Online (Sandbox Code Playgroud)

要将其添加回集群,我现在有以下 2 个选项:

  • 使用全新备份重建实例并从主实例恢复
  • 从实例中删除集群元数据并重新加入集群。

第一个选择始终是我的最后选择。所以我尝试了以下步骤:

  • 步骤1:var cluster = dba.getCluster();
  • 第2步:cluster.rescan();
  • 步骤 3:按删除交互式MySQL Shell'Y'窗口中丢失的节点。
  • 第4步:登录Missing节点并设置super_read_only = OFF;
  • 步骤 5:停止组复制:STOP GROUP_REPLICATION;
  • 步骤5:重置从机:RESET SLAVE ALL;
  • 步骤 6:删除集群元数据数据库:

    删除数据库 mysql_innodb_cluster_metadata;

  • 第 7 步:转到 shell 并将节点添加回集群:cluster.addInstance(instance);

  • 步骤 8:在交互窗口中:选择恢复方法"Clone"MySQL 8.0.16 及更高版本)。

我没有Incremental Recovery在这种情况下尝试,但在另一个例子中,它起作用了。

如果您因任何原因无法使用克隆增量恢复选项,请使用方法 1 重建实例。

我希望它有帮助!