当前位置: 首页 > news >正文

Mysql-经典故障案例(1)-主从同步由于主键问题引发的故障

故障报错

Could not execute Write_rows event on table test.users; Duplicate entry '3' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mysql-bin.000031, end_log_pos 3297

这是由于从库存在与主库相同主键值,导致从库无法同步的报错,也是非常经典的同步报错,接下来让我们一起来实战演练一下!

一、故障模拟步骤

环境准备
  • 主库:IP 10.33.112.22,MySQL 5.7
  • 从库:IP 10.30.76.4,MySQL 5.7
  • 同步数据库test
  • 测试表users(结构如下)
CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL
);

1 . 模拟数据不一致故障

  1. 主库插入数据

    -- 主库操作
    INSERT INTO test.users (name) VALUES ('Alice');
    INSERT INTO test.users (name) VALUES ('Bob');
    
  2. 从库手动篡改数据(模拟误操作)

    -- 从库操作(跳过主从同步,直接写数据)
    STOP SLAVE;  -- 临时停止复制
    INSERT INTO test.users (id, name) VALUES (3, 'Hacker'); -- 强制插入 id=3 的数据
    START SLAVE;  -- 重启复制
    
  3. 主库继续写入数据

    -- 主库操作
    INSERT INTO test.users (name) VALUES ('Charlie');  -- 该操作生成的id=3
    

3. 触发主从同步错误

此时主库将生成一条 id=3 的记录,但该事件在从库重放时,因从库的 AUTO_INCREMENT 计数器未更新,会发生以下错误:

-- 从库状态检查
SHOW SLAVE STATUS\G*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.1.100Master_User: replSlave_IO_Running: YesSlave_SQL_Running: No  -- SQL线程已停止Last_Error: Error 'Duplicate entry '2' for key 'PRIMARY'' on query...Last_Errno: 1062  -- 主键冲突错误

二、紧急处理办法

不推荐,可能会导致冲突的数据丢失,也就是在出库插入id=3的数据会丢失

什么是GTID

什么是GTID呢, 简而言之,就是全局事务ID(global transaction identifier ),最初由google实现,官方MySQL在5.6才加入该功能。
GTID是事务提交时创建分配的唯一标识符,所有事务均与GTID一一映射。

  • 非GTID模式

    SET GLOBAL sql_slave_skip_counter = 1;  -- 跳过1个事件
    START SLAVE;
    
  • GTID模式(需指定GTID_NEXT)

    STOP SLAVE;
    SET GTID_NEXT='uuid:3';  -- 替换为SHOW SLAVE STATUS中报错的GTID
    BEGIN; 
    COMMIT;           -- 空事务跳过冲突GTID
    SET GTID_NEXT=AUTOMATIC;
    START SLAVE;
    

举例,通过show slave status\G 查看一下这行信息,那我们需要跳过的gtid就为8dcd492d-ce6b-11ef-9803-005056b388fd:36

 Retrieved_Gtid_Set: 8dcd492d-ce6b-11ef-9803-005056b388fd:31-36

https://blog.csdn.net/u010735147/article/details/82468098

修复数据

在从库使用((20250226135629-6ufo3yl “pt-table-sync”))工具,会自动将不一样的数据做修改

主库

mysql> select * from users;
+----+---------+
| id | name    |
+----+---------+
|  1 | Alice   |
|  2 | Bob     |
|  3 | Charlie |

从库

mysql> select * from users;
+----+--------+
| id | name   |
+----+--------+
|  1 | Alice  |
|  2 | Bob    |
|  3 | Hacker |
+----+--------+

使用pt-table-sync修复

pt-table-sync --execute  --sync-to-master h=10.30.76.4 --databases=test --tables=users --print --verbose --ask-pass

从库恢复

mysql> select * from users;
+----+---------+
| id | name    |
+----+---------+
|  1 | Alice   |
|  2 | Bob     |
|  3 | Charlie |
http://www.lryc.cn/news/547488.html

相关文章:

  • Linux下学【MySQL】中如何实现:多表查询(配sql+实操图+案例巩固 通俗易懂版~)
  • ubuntu局域网部署stable-diffusion-webui记录
  • 最基于底层的运算符——位运算符
  • 代码随想录算法训练营第三十二天 | 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯
  • 3-9 WPS JS宏单元格复制、重定位应用(拆分单表到多表)
  • C++ 中前置 `++` 与后置 `++` 运算符重载
  • Scala:case class(通俗易懂版)
  • Vue、React、原生小程序的写法对比差异
  • 【AIGC系列】6:HunyuanVideo视频生成模型部署和代码分析
  • java 初学知识点总结
  • Android MVC、MVP、MVVM三种架构的介绍和使用。
  • AI视频领域的DeepSeek—阿里万相2.1图生视频
  • IDEA 2024.1.7 Java EE 无框架配置servlet
  • STM32---FreeRTOS中断管理试验
  • 深色系B端系统界面,在何种场景下更加适合?
  • 如何使用 Python+Flask+win32print 实现简易网络打印服务1
  • 深度学习DNN实战
  • 课程3. 分批训练与数据规范、标准化
  • 《机器学习数学基础》补充资料:过渡矩阵和坐标变换推导
  • linux指令学习--sudo apt-get install vim
  • 类和对象—多态—案例2—制作饮品
  • 嵌入式产品级-超小尺寸游戏机(从0到1 硬件-软件-外壳)
  • 计算机毕业设计Python+Django+Vue3微博数据舆情分析平台 微博用户画像系统 微博舆情可视化(源码+ 文档+PPT+讲解)
  • 前端开发10大框架深度解析
  • Mybatis 的关联映射(一对一,一对多,多对多)
  • 深度解码!清华大学第六弹《AIGC发展研究3.0版》
  • /dev/console文件详解
  • ProfibusDP主站转ModbusTCP网关如何进行数据互换
  • springboot3 WebClient
  • 牛客周赛 Round 83