我在 Slave 上收到错误消息:
无法在表 mydatabasename.atable 上执行 Write_rows 事件;键“PRIMARY”的重复条目“174465”,错误代码:1062;处理程序错误 HA_ERR_FOUND_DUPP_KEY;事件的主日志 mysql-bin.000004, end_log_pos 60121977
因为我直接从主人那里获得更新,所以为什么会发生这种情况。
我们如何才能有效地处理这个问题,以便从站上没有数据丢失。我不想再次设置整个复制以保持数据完整性。
谢谢..!
每当出现 1062 错误时,通常出现问题的表就是查询中正在更新的实际表。查询应该出现在
SHOW SLAVE STATUS\G
例如,在您的错误中它说
Duplicate entry '174465' for key 'PRIMARY'
. 这表明您应该174465
在执行 INSERT 或 UPDATE 的表中查找值。如果该行确实存在,您是否必须决定查询停止执行是否会更改该行的内容。如果查询将简单地重现完全相同的内容,并且您认为会出现这种情况,则可以执行以下两个选项之一:选项1
跳过错误,等待 5 秒,然后查看从站状态。这里是跳过错误的 5 个步骤
当您查看从属状态时,会出现以下情况
如果 Seconds_Behind_Master 为 NULL
如果 Seconds_Behind_Master 是一个数字
选项 2
删除该行以允许复制继续
从 Slave 上的表中删除该行并执行以下 4 个步骤来跳过错误:
冒着听起来多余的风险......
当您查看从属状态时,会出现以下情况
如果 Seconds_Behind_Master 为 NULL
如果 Seconds_Behind_Master 是一个数字
如果重复的关键问题太多怎么办?这是我之前的一些关于如何使用 MAATKIT 的mk-table-checksum、mk-table-sync、pt-table-checksum、pt-table-sync的帖子:
我制作了如下脚本来解决此问题:
创建一个 SQL 脚本,它将停止从站并设置
SQL_SLAVE_SKIP_COUNTER
为然后启动从站。然后 :
这样我解决了从属复制冲突。这可能对所有人都有帮助。
在我的情况下,从属复制坐标被破坏,我通过重置我的从属并通过新坐标将我的从属连接到主控来解决此问题,而不会丢失任何数据。首先,检查您的从属 gtid_slave_pos 是否与其他从属或主 gtid_current_pos 不同:
然后:
您可以在此处找到更多详细信息https://mariadb.com/kb/en/library/using-mariadb-replication-with-mariadb-galera-cluster-configuring-mariadb-r/#start-replication-on-the-new -奴隶
以下脚本将继续跳过全局计数器,直到复制错误得到修复。复制错误通常发生在从 master 转储的时间与 master 的位置不同时。
试试这个脚本:
注意:要添加密码,修改脚本如下: