首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解决innodb集群冲突

问如何解决innodb集群冲突
EN

Database Administration用户
提问于 2017-09-18 23:43:58
回答 2查看 7.6K关注 0票数 1

我目前正在维护一个包含三个节点的无害数据库集群。它运行良好,但有时一个节点将是MISSING,然后我必须再次在线提出它。

问题是我插入了一个没有主键的表。然后节点失败。当我想重新加入失败节点来集群时,它说它不能加入,因为有一个没有主键的表。我修改了集群中的表,使其具有主键,而失败节点仍然抱怨相同。因此,我删除了失败节点中的表,并希望它能够重新构建该表。

现在它说

代码语言:javascript
复制
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)

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

代码语言:javascript
复制
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"
}

我知道这是因为不同db中的不一致状态。但是我搜索了互联网,但是没有关于如何解决innodb集群中冲突的文档。任何建议都会有帮助的!

EN

回答 2

Database Administration用户

发布于 2019-12-13 07:08:16

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

我试图按如下方式重新加入实例以进行集群:

代码语言:javascript
复制
cluster.rejoinInstance(instance);

现在,cluster.status()函数报告,成员状态为“恢复”,但几分钟后,它再次报告为“缺失”。

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

另外,使用cluster.status({extended:true, queryMembers:true});函数检查集群状态并观察到,lastApplied块和startTimestamp显示了旧的日期,这证实了最近的事务没有应用于此实例。

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

代码语言:javascript
复制
cluster.removeInstance(instance);

并添加到实例中,如下所示:

代码语言:javascript
复制
cluster.removeInstance(instance);

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

因此,我查询了下表中缺少的实例,并再次计算出实例状态:

代码语言:javascript
复制
select * from performance_schema.replication_group_members;

要将返回添加到集群中,我现在有以下两个选项:

  • 使用新备份重新生成实例并从主服务器还原
  • 从实例中删除群集元数据,并将其连接回群集。

第一选择永远是我最后的选择。因此,我尝试了以下步骤:

  • 步骤1:var cluster = dba.getCluster();
  • 步骤2:cluster.rescan();
  • 步骤3:按'Y'以删除交互式MySQL Shell窗口中缺少的节点。
  • 步骤4:登录到缺失节点并设置super_read_only = OFF;
  • 步骤5:停止组复制:STOP GROUP_REPLICATION;
  • 步骤5:重置从服务器:RESET SLAVE ALL;
  • 步骤6:删除集群元数据数据库: DATABASE mysql_innodb_cluster_metadata;
  • 步骤7:转到shell并将节点添加回集群:cluster.addInstance(instance);
  • 步骤8:在交互式窗口上:选择恢复方法作为"Clone" (MySQL 8.0.16及更高版本)。

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

如果由于任何原因无法使用克隆或增量恢复选项,请使用方法1重新生成实例。

希望能帮上忙!

票数 4
EN

Database Administration用户

发布于 2017-09-19 16:47:48

好吧..。因此,我结束了部分擦除数据库,并再次通过reset master和drop database mysql_innodb_cluster_metadata对其进行重新同步。现在它很好用。

我还在想是不是有什么可以倒带而不是完全复位的.

票数 2
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/186268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档