在运维工作中,主从复制的过程中主键冲突了怎么办?

news/2025/2/28 12:32:36/文章来源:https://www.cnblogs.com/huangjiabobk/p/18742982

在 MySQL 主从复制环境中,主键冲突是一个常见的问题,尤其是在多主复制(Multi-Master)或主从复制中手动插入数据时。主键冲突会导致 SQL 线程停止,从而影响数据同步的正常进行。在运维工作中,处理主键冲突需要快速定位问题并采取合适的解决方案,以确保主从复制的稳定性和数据一致性。

以下是处理主从复制中主键冲突的详细步骤和方法:

1. 主键冲突的原因
  1. 多主复制环境

    • 在多主复制(Master-Master)环境中,两个主节点可能同时插入具有相同主键的记录,导致冲突。
  2. 手动插入数据

    • 在从节点(Slave)上直接插入数据,而这些数据的主键与主节点(Master)上的数据冲突。
  3. 数据迁移或恢复

    • 从其他数据库恢复数据时,未正确处理主键,导致与现有数据冲突。
  4. 复制延迟

    • 在主从复制中,由于网络延迟或从节点负载过高,导致某些事务在从节点上执行时发生冲突。
2. 如何发现主键冲突

当主从复制发生主键冲突时,从节点的 SQL 线程会停止,并记录错误信息。可以通过以下方式发现主键冲突:

1. 查看从节点状态
SHOW SLAVE STATUS\G;

重点关注以下字段:

  • Slave_SQL_Running:如果为 NO,说明 SQL 线程停止了。
  • Last_SQL_Error:显示错误信息,通常会包含“Duplicate entry”字样,表明发生了主键冲突。

示例输出:

Slave_SQL_Running: NO
Last_SQL_Error: Error 'Duplicate entry '123' for key 'PRIMARY'' on query. Default database: 'mydb'. Query: 'INSERT INTO mytable (id, name) VALUES (123, 'test')'
3. 解决主键冲突的方法
1. 跳过冲突的事务

如果主键冲突是暂时的或不重要的,可以通过跳过冲突的事务来恢复复制。

STOP SLAVE;
SET GLOBAL sql_slave_skip_counter = 1;  -- 跳过一个事务
START SLAVE;

注意

  • sql_slave_skip_counter 的值表示跳过的事务数量。如果需要跳过多个事务,可以设置为更大的值。
  • 跳过事务可能会导致数据不一致,需谨慎使用。
2. 手动修复数据

如果主键冲突是由于数据问题引起的,可以手动修复数据以解决冲突。

  1. 定位冲突的数据

    • 在主节点和从节点上查询冲突的记录:

      SELECT * FROM mytable WHERE id = 123;
      
  2. 删除或更新冲突的记录

    • 如果从节点上的数据是多余的,可以删除冲突的记录:

      DELETE FROM mytable WHERE id = 123;
      
    • 如果需要更新数据,可以手动修改冲突的记录:

      UPDATE mytable SET name = 'new_name' WHERE id = 123;
      
  3. 重新启动复制

    STOP SLAVE;
    RESET SLAVE;  -- 清除中继日志中的错误事务
    START SLAVE;
    
3. 调整主键生成策略

为了避免主键冲突,可以调整主键生成策略,确保主键在主从节点之间不会重复。

  1. 使用自增主键的偏移量

    • 在多主复制环境中,为每个主节点设置不同的自增偏移量:

      -- 在主节点1上
      SET GLOBAL auto_increment_offset = 1;
      SET GLOBAL auto_increment_increment = 2;-- 在主节点2上
      SET GLOBAL auto_increment_offset = 2;
      SET GLOBAL auto_increment_increment = 2;
      
    • 这样,每个主节点生成的主键值不会重复。

  2. 使用 UUID 或其他唯一标识符

    • 如果业务允许,可以使用 UUID 作为主键,避免冲突:

      INSERT INTO mytable (id, name) VALUES (UUID(), 'test');
      
4. 使用 ON DUPLICATE KEY UPDATE

在插入数据时,可以使用 ON DUPLICATE KEY UPDATE 语法,避免主键冲突导致的错误。

INSERT INTO mytable (id, name) VALUES (123, 'test')
ON DUPLICATE KEY UPDATE name = VALUES(name);

这样,如果主键冲突发生,MySQL 会自动更新现有记录,而不是报错。

4. 预防主键冲突的方法
1. 规范数据操作
  • 在从节点上避免直接插入数据,所有数据操作应通过主节点完成。
  • 如果必须在从节点上插入数据,确保主键不会与主节点冲突。
2. 监控复制状态

定期监控从节点的状态,及时发现并处理主键冲突:

SHOW SLAVE STATUS\G;
3. 使用半同步复制

在多主复制环境中,使用半同步复制可以减少主键冲突的可能性:

-- 在主节点上
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
SET GLOBAL rpl_semi_sync_master_enabled = 1;-- 在从节点上
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
SET GLOBAL rpl_semi_sync_slave_enabled = 1;

半同步复制确保主节点在提交事务前,至少有一个从节点确认收到 Binlog,从而减少冲突的可能性。

5. 我的总结

在 MySQL 主从复制中,主键冲突是一个常见的问题,但通过以下方法可以有效解决和预防:

  1. 发现冲突:通过 SHOW SLAVE STATUS 查看从节点状态,定位主键冲突。
  2. 解决冲突:根据实际情况选择跳过事务、手动修复数据或调整主键生成策略。
  3. 预防冲突:规范数据操作、监控复制状态,并使用半同步复制减少冲突的可能性。

综上所述,在运维工作中,快速定位和解决主键冲突是确保主从复制稳定运行的关键。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/891116.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何判断大小端?

联合体成员低地址对齐方法一:联合体 #include <stdio.h> #include <malloc.h>union myunion {int a;char b; };int main(void) {union myunion test;test.a = 0x12345678; if (test.b == 0x78)printf("小端模式"); else if (test.b == 0x12)printf(&q…

hexo 本地启动项目 hexo-browsersync 不工作原因总结

问题 1 : hexo-server 开启 compress 压缩后 hexo-browsersync 插件热更新完全无效,没办法自动刷新 此问题表现在 hexo 任何版本 问题原因: hexo-server 依赖 compression^1.7.4 会自动安装 compression@1.8.0,压缩后 Content-Encoding 不是 gzip 而是 br, hexo-browsersy…

共振底选股思路和案例

当前时间: 2025年2月28日 主图中的所有提示都编写了选股指标,我无偿分享。 共振底选股思路: 在短线、中线均都向上的情况下,同时出现以下条件的两个以上,则为共振底。 1. 1025战法的低吸位附近出现止跌阳线。 2. 小底图形反包。 3. 泰乐KDJ副图指标显示【大进】、【逛进】…

Vue2/Vue3 项目生产环境开启 vue devtools 插件线上调试 vue 组件

说到 vue 项目的调试工具,必然少不了 “vue devtools 插件”,此插件就像“手术刀”一样,是开发环境下的一个利器,生产环境一般情况没办法使用。 要在生产环境使用,就必须要一点手段。前置条件安装 Chrome 浏览器,本文编写时使用的 Google Chrome 133 版本。 安装 vue dev…

Windows编程系列:获取系统BIOS信息

在前面的文章中,介绍过WMI的使用 https://www.cnblogs.com/zhaotianff/p/14764740.html在Win32 Provider下面提供了一个Win32_BIOS类,可以获取BIOS信息我们还可以通过SMBIOS标准规范来获取BIOS信息SMBIOS介绍 SMBIOS (System Management BIOS ,系统管理BIOS)是通过系统固件…

【大模型安全】大模型攻击测试案例分析

本节通过对实际案例的研究,直观展示大模型(LLM)攻击测试是如何识别模型中存在的安全隐患。为确保被测大模型系统的安全运行,我们仅执行了无危害的查询操作,目的是发现潜在的安全漏洞和风险点。 案例1: 某互联网厂商LLM存在远程代码执行漏洞(过度代理),攻击者可通过此漏…

谷歌 Chrome 浏览器离线安装 vue devtools 插件

由于某些原因,Chrome 应用商店访问不了,所以只能离线安装 vue devtools 插件,离线安装也有两种方法。 方法一:自编译 vue devtools 插件 这方法要求动手能力强的同学。前往 github 下载 vue devtools 插件源码(https://github.com/vuejs/devtools)。在本地编译源码。编译成…

CRM选型避坑指南:别踩这些常见雷区!

选CRM就像找工作,选错了不仅折腾自己,还浪费时间和钱。 市面上CRM那么多,花里胡哨的功能一堆,价格跨度也大,选起来就像进了迷宫,一不小心就掉坑里。所以今天就聊聊那些常见的选型雷区,教你如何避开这些坑,选到真正适合自己的CRM!这里整理好了最好用CRM系统——简道云 …

医院HIS系统通过互联网调用医保内网(专网)接口

前言其实更准确的主题应该为:如何通过互联网访问专网服务器的http 服务,因为原理是一样的。全国医保刚实行升级时,很多HIS开发人员通过远程医院前置机再跳转医保网进行调试,操作很麻烦,如果能在办公室通过互联网直接访问医保网那就太方便了。全国医保的接口都是通过http方…

No.26 JavaScript--简介

前端3件套:HTML CSS JS 一、JS简介JavaScript 是一种轻量级的脚本语言。所谓“脚本语言”,指的是它不具备开发操作系统的能力,而是只用来编写控制其他大型应用程序的“脚本”。 JavaScript 是一种嵌入式(embedded)语言。它本身提供的核心语法不算很多。1.为什么学JS操控浏…

打造自主高效团队:企业团队协作工具私有化部署指南

企业团队协作工具的私有化部署是指将软件部署在企业自有的服务器上,而非使用公有云或第三方平台。以下是对企业团队协作工具私有化的详细分析: 一、私有化的优势 ● 数据安全可控:企业数据存储在本地服务器,无需上传至第三方平台,有效降低数据泄露风险,满足企业对数据安全…

快收藏!一个技巧从此不再搞混缓存穿透和缓存击穿

在 Redis 中有两个定义:一个缓存击穿、一个缓存穿透,因为二者的名字比较像,因此很容易就搞混了。但本文会给你提供一个记忆的小技巧,帮你彻底区分二者的定义。 在讲这个技巧之前,我们先来了解一下二者的区别。 1.定义与区别缓存穿透(Cache Penetration):缓存穿透是指查…