我目前正在维护一个包含三个节点的无害数据库集群。它运行良好,但有时一个节点将是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)在我运行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"
}我知道这是因为不同db中的不一致状态。但是我搜索了互联网,但是没有关于如何解决innodb集群中冲突的文档。任何建议都会有帮助的!
发布于 2019-12-13 07:08:16
我最近已经解决了这个问题,步骤如下:
我试图按如下方式重新加入实例以进行集群:
cluster.rejoinInstance(instance);现在,cluster.status()函数报告,成员状态为“恢复”,但几分钟后,它再次报告为“缺失”。
我登录了丢失的实例并验证了processlist SHOW FULL PROCESSLIST;,但是我看不到任何活动的流量,我通过查询几个用户表来验证数据的不一致性。
另外,使用cluster.status({extended:true, queryMembers:true});函数检查集群状态并观察到,lastApplied块和startTimestamp显示了旧的日期,这证实了最近的事务没有应用于此实例。
然后,我执行了以下步骤将实例从集群中删除:
cluster.removeInstance(instance);并添加到实例中,如下所示:
cluster.removeInstance(instance);这产生了错误:The instance is already part of the another Group Replication;
因此,我查询了下表中缺少的实例,并再次计算出实例状态:
select * from performance_schema.replication_group_members;要将返回添加到集群中,我现在有以下两个选项:
第一选择永远是我最后的选择。因此,我尝试了以下步骤:
var cluster = dba.getCluster();cluster.rescan();'Y'以删除交互式MySQL Shell窗口中缺少的节点。super_read_only = OFF;STOP GROUP_REPLICATION;RESET SLAVE ALL;cluster.addInstance(instance);"Clone" (MySQL 8.0.16及更高版本)。在这种情况下,我没有尝试Incremental Recovery,但在另一个实例中,它起了作用。
如果由于任何原因无法使用克隆或增量恢复选项,请使用方法1重新生成实例。
希望能帮上忙!
发布于 2017-09-19 16:47:48
好吧..。因此,我结束了部分擦除数据库,并再次通过reset master和drop database mysql_innodb_cluster_metadata对其进行重新同步。现在它很好用。
我还在想是不是有什么可以倒带而不是完全复位的.
https://dba.stackexchange.com/questions/186268
复制相似问题