一、前言

开发突然紧急的过来说,他们记录无法插入了,有报重复键错误

ERROR 1062 (23000): Duplicate entry '2147483647' for key 'PRIMARY'

表名和数据都是采用测试数据,结果和生产的现象是一致的

二、分析

测试环境为percona server 5.7.20。首先查看表数据和表结构,结果如下

mysql> select  * from t2 order by id desc limit 3;
+------------+------+------+
| id         | c1   | c2   |
+------------+------+------+
| 2147483647 |  101 |  101 |
|        100 |  100 |  100 |
|          4 |    4 |    4 |
+------------+------+------+
3 rows in set (0.00 sec)
mysql> show create table t2\G
*************************** 1. row ***************************Table: t2
Create Table: CREATE TABLE `t2` (`id` int(11) NOT NULL AUTO_INCREMENT,`c1` int(11) DEFAULT NULL,`c2` int(11) DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `uniq_c1` (`c1`)
) ENGINE=InnoDB AUTO_INCREMENT=2147483647 DEFAULT CHARSET=utf8mb4
1 row in set (0.00 sec)

我们可以发现,其中id 是有符号的int,已经达到了int的最大值,但是这个表没有相应的时间字段来记录这个id=2147483647 的记录是何时插入或者更新的。和开发联系问有没有手动执行插入指定ID字段的,开发回复没有。拿到发送报错的时间点,把时间点之前的binlog 捞了下,都没找到有id=2147483647的插入记录。查找DDL变更记录,只找到了该表其他字段的变更,刚好在这个报错的时间点之前,但是没有修改auto_increment的值,一时间陷入了懵逼状态。

为了找到原因,豁出去了。用了九牛二虎之力,使用二分查找恢复了好多份备份,同时结合binlog ,终于确认这条记录的具体插入时间。意外的是,我发现这条记录插入的binlog是这样的

insert into t2(id,c1,c2) values(101,101,101) 也就是说,插入的时候的id 是101,并不是 2147483647,那又是为啥呢?

继续解析binlog,我发现了新大陆

update t2 set id=4147483647,c1=101,c2=101 where id=101;

通过dml平台的日志审计功能,我们找到了对应的开发,发现是开发误操作把主键更新了,然后溢出,id变成了2147483647

此时,表的ddl 的 auto_increment 还是等于101,并没有变成2147483647。后面的正常业务SQL进行insert产生的id正常产生,因此可以执行成功,直到我们做了一次DDL,加了以个字段,MySQL重新计算了auto_incremnt的值,变成了2147483647,新插入的SQL的自增值无法继续分配,主键冲突,业务开始报错,才发现了这个定时炸弹。

三、小结

MySQL如果在指定id 进行插入的时候,如果这个id大于表的自增值,那么MySQL会把表的自增值修改为这个id,并加1,但是如果我们把主键更新成更大的值,MySQL并不会把表的自增值修改为更新后的值,会埋下一颗定时炸弹,在某些情况下,如DDL,重启等之后,业务开始报错,会误认为DDL或者重启导致业务表的插入故障。

该问题在percona 5.6.24 和 percona 5.7.20均有出现,在MySQL 8.0.11 中表现正常。找到BUG发现2005年就有被提出,因为性能原因以及场景很少没有被修复

参考链接:

  1. https://dev.mysql.com/doc/refman/5.7/en/innodb-auto-increment-handling.html#innodb-auto-increment-initialization

  2. https://bugs.mysql.com/bug.php?id=12434

往期推荐

把 14 亿人都拉到一个微信群,在技术上能实现吗?

这样统计代码执行耗时,才足够优雅!

来看看Google的未来工作环境设计,有你喜欢的元素吗?

小小登录,大大讲究!你的登录功能都做到位了吗?

不错!基于Springboot 2.0 + LayUI开发的物流管理系统(已开源)

推荐一个长期关注于

数据库技术以及性能优化、故障案例分析的公众号

记一次MySQL AUTO_INCREMENT的故障相关推荐

  1. mysql lib_explode_这简直就是一个“定时炸弹”!记一次 MySQL 的奇葩故障

    开发突然紧急的过来说,他们记录无法插入了,有报重复键错误 ERROR 1062 (23000): Duplicate entry '2147483647' for key 'PRIMARY' 表名和数 ...

  2. 记一次Mysql数据库Innodb故障--误删除idb文件

    某天中午,午休快要结束的时候,勤奋.努力.敬业的小编巡检服务器,发现有一台服务器的/home分区空间不足.因为历史原因,这是一个旧的平台,新平台已经建成,也已经投入生产.可是旧平台上依然还有很多的业务 ...

  3. mysql改表字段类型导致数据丢失_故障分析 | 记一次 MySQL 主从双写导致的数据丢失问题【转】...

    一.问题起源 不久前用户反馈部门的 MySQL 数据库发生了数据更新丢失.为了解决这个问题,当时对用户使用的场景进行了分析.发现可能是因为用户在两台互为主从的机器上都进行了写入导致的数据丢失. 如图所 ...

  4. 记一次MySQL自增ID用完了怎么办

    记一次MySQL自增ID用尽后引发的错误 MySQL自增ID用完了一般分两种情况,第一种情况是MySQL表有主键:第二种情况是MySQL表没有主键. 1. 有主键 通常,我们设置主键的的时候一般都会把 ...

  5. 记一次mysql性能优化过程

    2019独角兽企业重金招聘Python工程师标准>>> 转发自:记一次mysql性能优化过程 由于配置是运行过那么长时间,很稳定,基本上不考虑,所以本次主要是sql的优化,并且集中在 ...

  6. 老男孩教育每日一题-2017年4月28日- MySQL主从复制常见故障及解决方法?

    MySQL主从复制常见故障及解决方法? 1.1.1故障1:从库数据与主库冲突 show slave status; 报错:且show slave status\G Slave_I/O_Running: ...

  7. go mysql slave_【Golang+mysql】记一次mysql数据库迁移(一)

    # [记一次mysql数据库迁移(一)](https://github.com/stayfoo/stayfoo-hub/blob/master/docs/mysql/blog/%E8%AE%B0%E4 ...

  8. zabbix mysql监控告警_Zabbix监控mysql配置及故障告警配置

    同时介绍了触发器的创建及zabbix通过邮件方式告警配置. 一.配置自带模板监控mysql 1.提供配置文件模板 文件位置在源码包/usr/local/src/zabbix-3.0.4/conf/za ...

  9. mysql auto_increment 原理_[Mysql]mysql原理之Auto_increment

    2019独角兽企业重金招聘Python工程师标准>>> 引言 MySQL中auto_increment字段估计大家都经常用到,特别是innodb引擎.我也经常用,只知道mysql可以 ...

最新文章

  1. JS实现文本框有“请输入关键字”功能
  2. java swing 表格不显示_JAVA SWING 表头不显示问题
  3. Java线程详解(8)-线程的同步
  4. 【Linux】 Linux 系统文件相关的操作命令
  5. idea 转普通项目为maven 项目
  6. 1019 数字黑洞 (20分)
  7. opencv 不同边缘检测算子效果比较
  8. 金币 详解(C++)
  9. matlab计算积和式,定积分计算方法总结
  10. 计划策略10、11、40
  11. 关于Aegisub的视频滤镜插件和字幕滤镜插件
  12. 环信头像和昵称显示问题 (添加消息扩展)--本人已实现效果
  13. nova-compute
  14. 三大视角,聊聊我眼中的广告系统
  15. 加速PG中vacuum
  16. 世界十大骨传导耳机排行榜、实测主流骨传导耳机推荐解析必看榜单
  17. oracle 存储过程基本语法
  18. 水果分割论文、代码和数据集汇总
  19. python英文发音-利用Python制作查单词小程序(二):下载音频并播放单词读音
  20. Table固定列和表头

热门文章

  1. 使用 html 标签嵌入Silverlight程序的一点小问题
  2. linux libuv 交叉编译 高性能事件驱动库
  3. linux 查看显卡信息
  4. linux rsync同步 --delete参数 删除目标目录比源目录多余文件
  5. 安装 centos 7.x 自定义分区
  6. dns劫持简介 https流量数据获取原理
  7. cmake 添加头文件目录,链接动态、静态库
  8. mysql null 和 空字符串 区别
  9. Nmap用法的思维导图
  10. 5g的八大关键指标_你对5G技术标准了解多少(干货)