MySQL怎么在从库解决由于主键冲突导致的Slave_SQL_Running停止

阿枫吖_4905

阿枫吖_4905

2026-10-15

354人浏览

原创

1062错误需先查show slave status\g确认last_sql_error,区分主库重复插入或从库误写;rbr模式下须用mysqlbinlog解析relay log定位冲突行;优先delete从库多余数据而非跳过事务,gtid模式下跳过需set gtid_next后空事务提交。

mysql怎么在从库解决由于主键冲突导致的slave_sql_running停止

查Last_SQL_Error确认是1062错误

看到Slave_SQL_Running: No,第一件事不是停启复制,而是执行SHOW SLAVE STATUS\G,直接盯住Last_SQL_Error字段。如果报错里有Duplicate entry和Error_code: 1062,基本能确定是主键冲突——但得进一步区分:是主库真插入了重复值,还是从库被误写过?

  • 1062在RBR模式下常伴随at master log mysql-bin.xxxxxx, end_log_pos NNNN,看不到SQL本身,必须解析relay log才能确认操作对象
  • 别只看错误里的表名和ID,有些应用用复合主键或UUID,Duplicate entry '10086' for key 'PRIMARY'里的10086未必是自增ID,可能是业务字段拼接值
  • 如果Last_SQL_Error还带on query: INSERT INTO ...(即显示完整语句),大概率是SBR模式,或MySQL版本较老;新版RBR极少这样输出

用mysqlbinlog解析relay log定位具体行

RBR模式下,光看Last_SQL_Error只能知道位置,不知道哪张表、哪一行冲突。必须用mysqlbinlog读取从库本地的relay log文件,还原出真实变更。

  • 先用ls /var/lib/mysql/*relay*确认relay log真实路径(Docker环境常带主机名前缀,如mysql-relay-bin-abc123.000001)
  • 根据end_log_pos前后各偏移50–100字节解析:mysqlbinlog --base64-output=decode-rows -v --start-position=123400 --stop-position=123500 /var/lib/mysql/relay-log.000001
  • 重点找### INSERT INTO `db`.`table`和### SET @1=... @2=...段,比对@1(通常是主键)是否与从库现存记录冲突
  • 如果解析出的INSERT在从库手动执行也报1062,说明冲突行已存在;如果执行不报错,那问题可能出在触发器、外键或分区表逻辑上

优先DELETE冲突行,而不是跳过事务

SET GLOBAL sql_slave_skip_counter = 1在RBR下极危险:它跳过的不是一条语句,而是一个事务里的若干行事件,容易导致部分更新、半截脏数据。对1062,更安全的做法是清理从库侧的“多余”数据。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
  • 执行SELECT * FROM table WHERE primary_key = X(X取自### SET @1=X),确认该行是否本不该存在
  • 如果该行是运维误操作写入(比如手动INSERT测试数据),直接DELETE FROM table WHERE primary_key = X,再START SLAVE
  • 如果该行是历史残留、但业务上应存在(比如主库删过又重插),需同步检查主库binlog中对应时间点是否有DELETE,避免误删有效数据
  • 若表无主键或用UUID,冲突可能源于并发写入,此时应补主键+监控从库read_only=ON,防止人为写入

跳过事务仅限紧急止血,且必须用GTID方式

当冲突行无法简单DELETE(比如涉及外键级联、或业务逻辑复杂),且必须快速恢复复制时,跳过是最后手段。但sql_slave_skip_counter在GTID模式下已失效,强行使用会报错Cannot use sql_slave_skip_counter when @@GLOBAL.GTID_MODE = ON。

  • 先STOP SLAVE,然后从Last_SQL_Error里提取GTID,形如f8e7f9b2-1a3c-11ef-8a12-00155d012345:12345
  • 执行:SET GTID_NEXT='f8e7f9b2-1a3c-11ef-8a12-00155d012345:12345'; BEGIN; COMMIT; SET GTID_NEXT='AUTOMATIC'; START SLAVE;
  • 跳过后立刻SHOW SLAVE STATUS\G确认Exec_Master_Log_Pos推进、Seconds_Behind_Master开始下降
  • 跳过不等于修复:务必记录该GTID,后续用pt-table-checksum或mysqldiff校验主从一致性,尤其关注该事务涉及的表

真正麻烦的从来不是1062这个错误码,而是你不确定那条“冲突”的数据,到底是该留、该删、还是该从主库反向同步过来。很多线上事故,都是跳过之后发现下游报表少了一天订单,才意识到那个“重复插入”其实是补偿逻辑的一部分。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4283

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

911

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1109

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

6201

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

3043

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

6180

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

8361

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1130

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

992

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 187人学习