MySQL主从自增列AUTO_INCREMENT不同步

2023-11-08

环境信息:

MySQL版本:5.7.32

架构:一主(192.168.1.110:3306)一从(192.168.1.111:3306)

binlog:on

binlog_row_image:full

binlog_format:row

gtid:on

问题:

        MySQL主从自增列AUTO_INCREMENT不同步

问题复现以及分析:

        创建测试表

use test
CREATE TABLE `t1` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`bank_code` bigint(20) NOT NULL ,
`bank_name` bigint(20) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_bank_code` (`bank_code`)
) ENGINE=InnoDB

        插入数据

insert into t1 values(1,1,1),(2,2,2),(3,3,3);

        查看表t1数据

select * from t1;

主192.168.1.110:3306:

         从192.168.1.111:3306:

        查看表t1的自增列使用,主从自增列使用都为4

show create table t1;

        主192.168.1.110:3306:

        从192.168.1.111:3306: 

        继续插入数据,采用replace into,在没有主键冲突的情况下,replace into 跟insert 一样直接插入一行数据(1 row affected) 

replace into t1(bank_code,bank_name) values(4,10);

        查看数据以及自增列的使用,主从一致

      主192.168.1.110:3306:

        从192.168.1.111:3306:

继续采用replace into插入,可以看到这次操作了2行数据( 2 rows affected replace ino ),这是因为发生唯一冲突的时候,采用先delete唯一值冲突的数据,再insert新数据的方式

replace into t1(bank_code,bank_name) values(1,11);

        MySQL官方文档也有说明 

        再一次查看表的数据以及自增列的使用,会发现主库的自增列加1变为6,但从库的自增列依然为5,没有变化

        主192.168.1.110:3306:

        从192.168.1.111:3306:

        为什么从库的自增列没有更新?

       查看binlog的日志记录,可以发现在binlog里面冲突的操作数据 记录的是update的操作不是(delete+insert),而update操作是不更新表自增列的最大使用值

 

        自增列AUTO_INCREMENT不同步会导致主从切换之后,插入数据出现主键冲突的问题

 

 问题总结:

        该问题在MySQL官方的Bug#73563有记录,执行replace into插入,遇到主键或者唯一键冲突,会进行delete再insert的操作,但binlog里面记录的是直接update的操作,在从库应用binlog时,由于update操作是不更新自增主键的值,这会导致从库自增列的使用最大值小于当前已有数据的最大值,在主从切换之后,导致主键或者唯一键冲突的情况 。

        此外,使用insert … on duplcate key update测试,发现也会遇到上述的情况。

问题解决:

        1 升级到MySQL 8.0,在8.0版本,对于update自增列的操作,也会更新AUTO_INCREMENT值

        2 数据库禁用replace into 以及insert … on duplicate key update,由应用层逻辑实现

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL主从自增列AUTO_INCREMENT不同步 的相关文章

随机推荐

  • ChatGPT作者John Shulman:我们成功的秘密武器

    推荐 深度学习与NLP 来源 转载自OneFlow 杨婷 徐佳渝翻译 除了OpenAI 外界可能很少有人知道ChatGPT模型成功的真正原因 实际上 OpenAI也会对ChatGPT拥有的巨大影响力感到不可思议 这种困惑和惊喜就像工程师们解
  • CV-第三方库:OpenMMLab---->MMClassification

    MMClassification 是一款基于 PyTorch 的开源图像分类工具箱 是 OpenMMLab 项目的成员之一 主分支代码目前支持 PyTorch 1 5 以上的版本 主要特性 支持多样的主干网络与预训练模型 支持配置多种训练技
  • Android 获取网络连接状态新方法

    一 问题背景 Android12上 有的app模块判断当前网络的类型和连接状态时 还是使用的旧的API 导致返回的结果不准确 影响代码逻辑判断 本篇文章就这一问题 整理一下判断网络类型和连接状态的新方法 二 原因分析 在Android 10
  • Flutter学习-TextField

    目录 focusNode 获取焦点 decoration InputDecoration边框装饰 keyboardType TextInputType 输入的类型 textCapitalization TextCapitalization
  • 使用Angular编写用户管理系统前台界面

    目录 工作准备 项目框架 功能描述 工作准备 安装node js node js中包含了npm node v查看node版本 npm v查看npm版本 全局安装angular CLI npm install g angular cli ng
  • win11系统激活修复

    打开终端 输入以下代码 irm https massgrave dev get iex 在弹出的窗口中 选择1即可
  • jquery 中 $(".XXX") 和 $("#XXX")的区别

    XXX 为获取类名为XXX的类 XXX 为获取id为XXX的标签
  • cesium 申请秘钥(Cesium.Ion.defaultAccessToken/access_token)

    https cesium com ion signin tokens 然后注册 登录 复制使用 Cesium Ion defaultAccessToken 你的 token 案例
  • Delphi TIdTCPClient的使用问题

    开发环境Delphi10 3 3 使用TIdTCPClient写了一个客户端小例子 使用网络调试助手作为服务端 设置接收到客户端信息会自动返回数据 通讯模式 短连接 客户端连接 发送 等待数据 接收 断开 此例子中客户端不知道返回信息长度是
  • Android动态界面开发框架Tangram使用完整教程(转载)

    原文链接 https blog csdn net u013541140 article details 89517186 Github地址 https github com jimmysuncpt TangramDemo
  • Unity3D设置天空盒skybox

    由于又忘记了 就写一篇博客做下笔记 此方法适用于5 X版本和2017版本 之后是否可行未测试 设置天空盒有两种方式 一 在当前相机上添加skybox 二 在当前场景上添加skybox 两种方式的结果是一样的 第一种方式的优势在于 如果 世界
  • elementUI +vue表单验证 后台请求动态验证

    elementUI vue表单验证 后台请求动态验证 在
  • grub 配置文件

    DO NOT EDIT THIS FILE It is automatically generated by grub mkconfig using templates from etc grub d and settings from e
  • Python刷题记录(91-95)

    Python刷题记录 91 95 题目来源PTA平台 PAT Basic Level Practice 中文 TOC 1091 N 自守数 如果某个数 K 的平方乘以 N 以后 结果的末尾几位数等于 K 那么就称这个数为 N 自守数 例如
  • C++socket编程(三):3.1 TCP/IP协议特点

    1 TCP是面向连接的 就是当你想要开始传递数据的时候 之前应该先把连接建立起来 它不像UDP协议 可以直接发送数据 2 TCP提供可靠的数据传输 实现了丢失重传 RTT的估算 3 TCP通过给所发送数据的每一个段管理一个序号进行排列 每一
  • int a 和int*a = new int 的区别

    int a 是分配在栈上的 会自动地释放 int a new int 分配在堆上面的 需要程序员手动地释放不然会造成内存的泄漏
  • 【git】在删除某一commit时出现error: The following untracked working tree files would be overwritten by checkou

    问题 error The following untracked working tree files would be overwritten by checkout test1 gitignore test1 matplotlib pl
  • redis学习04-jedis和redisson

    jedis是什么 jedis是为了方便在java代码中让java程序员操作redis命令而产生的 redisson是什么 redisson是为了更好的让java程序员能够按照正常书写java代码中的那些集合类的思维去操作redis 离开re
  • react搭建websocket通信架构

    前言 随着跨端技术的发展 前端开发职能不再局限于浏览器 而是具备了很多客户端开发的能力 比如桌面应用框架Electorn 移动App框架React native 一般而言 前端同学对http协议非常熟悉 在平时的工作中使用http与后端通信
  • MySQL主从自增列AUTO_INCREMENT不同步

    环境信息 MySQL版本 5 7 32 架构 一主 192 168 1 110 3306 一从 192 168 1 111 3306 binlog on binlog row image full binlog format row gti