编辑
2025-04-30
数据相关
00
请注意,本文编写于 45 天前,最后修改于 45 天前,其中某些信息可能已经过时。

目录

Mysql主从复制,1062主键冲突报错:Could not execute Writerowsv1 event on table schemaname.tablename; Duplicate entry '722527' for key 'PRIMARY
问题原因:
解决方法:
基本用法:
不指定特定数据库进行比对:
指定特定数据库进行比对:
参数说明
主库配置
从库配置
时间范围配置
数据库选择配置

Mysql主从复制,1062主键冲突报错:Could not execute Write_rows_v1 event on table schema_name.table_name; Duplicate entry '722527' for key 'PRIMARY

背景: 主从复制的2个节点,通过keepalived进行vip绑定,原来的主库是在虚拟机里的docker容器里,而从库是安装在虚拟机环境下。在进行vip切换后,程序侧反馈无法连接vip数据库,但是,在从库中却能看到有会话连接进来。研发经过几次重启程序无果后,决定回退。回退后,发现业务数据,已经有写入数据到从库中。当再次进行主从同步时,就会产生1062主键冲突的问题。

问题原因:

  • 业务表的主键id采用自增属性,在从库中已经写入的数据会占用自增ID
  • 当vip切回时,业务数据正常写入到主库后,产生的自增ID和从库中原来写入的自增ID发生冲突导致

解决方法:

  • 通过跑批量脚本确认都有哪些业务表受到影响
  • 根据统计到的影响业务表进行在主从库上修复

基本用法:

不指定特定数据库进行比对:

bash
./dbcompare --master-host=主库主机 --master-port=主库端口 --master-user=用户名 --mast --slave-host=从库主机 --slave-port=从库端口 --slave-user=用户名 --slave-p --start-time="2025-04-27 19:06:47" --end-time="2025-04-27 19:32:18"

指定特定数据库进行比对:

bash
./dbcompare --master-host=主库主机 --master-user=用户名 --master-password=密码 \ --slave-host=从库主机 --slave-user=用户名 --slave-password=密码 \ --schemas="jicai_member,jicai_product"

参数说明

主库配置

  • --master-host: 主库主机地址 (默认: localhost)
  • --master-port: 主库端口 (默认: 3306)
  • --master-user: 主库用户名 (默认: root)
  • --master-password: 主库密码

从库配置

  • --slave-host: 从库主机地址 (默认: localhost)
  • --slave-port: 从库端口 (默认: 3307)
  • --slave-user: 从库用户名 (默认: root)
  • --slave-password: 从库密码

时间范围配置

  • --start-time: 比对开始时间 (格式: YYYY-MM-DD HH:MM
    )
  • --end-time: 比对结束时间 (格式: YYYY-MM-DD HH:MM
    )

如果未指定时间范围,默认为当前时间的前24小时到当前时间。

数据库选择配置

  • --schemas: 指定要比对的数据库列表,以逗号分隔。如果不指定,则比对所有非系统数据库
### 确认表数据影响的行 ```sql SELECT * FROM jicai_member.`es_member_comment` WHERE create_time>=1745752007 AND create_time<=1745753538; -- comment_id:722527-722550 -- 24条记录需要处理

在主库上修改预留主键ID:comment_id

sql
alter table jicai_member.`es_member_comment` AUTO_INCREMENT=724920; -- 旧值:724884

在从库中查询出24条数据,预分配comment_id:724885 -- 724908 生成导出insert语句

执行插入到主库表中

在从库中删除这24条记录,并设置自增id为:722527

sql
DELETE FROM jicai_member.`es_member_comment` WHERE comment_id>=722527 AND comment_id<=722550;; ALTER TABLE jicai_member.`es_member_comment` AUTO_INCREMENT=722527;
mysql> start slave; Query OK, 0 rows affected (0.01 sec) mysql> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 10.3.8.160 Master_User: slave Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.001561 Read_Master_Log_Pos: 704393411 Relay_Log_File: relay-bin.001569 Relay_Log_Pos: 33686424 Relay_Master_Log_File: mysql-bin.001560 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 35678151 Relay_Log_Space: 7027999946 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 241231 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1 Master_SSL_Crl: Master_SSL_Crlpath: Using_Gtid: No Gtid_IO_Pos: Replicate_Do_Domain_Ids: Replicate_Ignore_Domain_Ids: Parallel_Mode: optimistic SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Reading event from the relay log Slave_DDL_Groups: 0 Slave_Non_Transactional_Groups: 0 Slave_Transactional_Groups: 4265 1 row in set (0.00 sec) ERROR: No query specified mysql>

本文作者:Kevin@灼华

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!