• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >Mysql > 深入探寻mysql自增列导致主键重复问题的原因

深入探寻mysql自增列导致主键重复问题的原因

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-11

通过本文主要向大家介绍了骆驼祥子探寻悲剧原因,探寻祥子悲剧的原因,探寻悲剧原因,专题二探寻悲剧原因,探寻原因等相关知识,希望本文的分享对您有所帮助

废话少说,进入正题。

     拿到问题后,首先查看现场,发现问题表的中记录的最大值比自增列的值要大,那么很明显,当有记录进行插入时,自增列产生的值就有可能与已有的记录主键冲突,导致出错。首先想办法解决问题,通过人工调大自增列的值,保证大于表内已有的主键即可,调整后,导数据正常。问题是解决了,接下来要搞清楚问题原因,什么操作导致了这种现象的发生呢?

      这里有一种可能,即业务逻辑包含更新自增主键的代码,由于mysql的update动作不会同时更新自增列值,若更新主键值比自增列大,也会导致上述现象:记录最大值比自增主键值大。但开发反馈说这张表仅仅存在load data infile操作,不会进行更新主键操作,所以这个解释行不通。继续分析,表中含有唯一约束,会不会和唯一约束有关,线下实验模拟没有重现。后来想想会不会和主备切换有关系,因为前两天做过一次主备切换。于是乎,配合主备环境作了测试,果然和主备切换有关系,一切问题的来源都清晰了。

问题发生的前置条件:

       1.mysql复制基于row模式

       2.innodb表

       3.表含有自增主键,并且含有唯一约束

       4.load data infile 采用replace into语法插入数据【遇到重复唯一约束,直接覆盖】

问题发生的原理:

        1.主库遇到重复unique约束时,进行replace操作;

        2.replace在主库上面实际变化为delete+insert,但binlog记录的是update;

        3.备库重做update动作,更新主键,但由于update动作不会更新自增列值,导致更新后记录值大于自增列值

问题重现实验:

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 深入探寻mysql自增列导致主键重复问题的原因

相关文章

  • 2017-05-11利用MySQL函数实现判断视频扩展名的代码
  • 2018-12-05加强MySQL用户安全
  • 2018-12-05sql 去零函数 datagridview中数字类型常出现后面的零不能去掉
  • 2018-12-05一些有用的sql语句整理 推荐收藏
  • 2018-12-05SQL Server 聚集索引和非聚集索引的区别分析
  • 2018-12-05SQL语句练习实例之七 剔除不需要的记录行
  • 2018-12-05mysql cast与convert 函数的用法
  • 2018-12-05MYSQL学习总结(六):my.cnf 各参数配置及根据状态优化
  • 2017-05-11mysql 获取当前日期函数及时间格式化参数详解
  • 2018-12-05mysql5.7.21 winx64安装配置图文分享

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • 解析mysql数据库设计技巧
    • sqlserver2005 TSql新功能学习总结(数据类型篇)
    • Linux上通过binlog文件恢复mysql数据库详细步骤_MySQL
    • MongoDB增加用户认证: 增加用户、删除用户、修改用户密码、读写权限、只读权限
    • 选择MySQL数据库进行连接的简单示例
    • mysql远程机器导入导出数据 锁表不锁表 部分数据或全部
    • mysql性能优化指南
    • Mysql之EXPLAIN显示using filesort介绍
    • MySQL查询优化:连接查询排序limit(join、order by、limit语句)介绍
    • mysql中关联变量条件修改、查询以及数据显示成一行的介绍

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有

准备工作

Create table test_autoinc(id int auto_increment, c1 int,c2 varchar(100),primary key(id),unique key(c1));

insert into test_autoinc(c1,c2) values(1,'abc');

insert into test_autoinc(c1,c2) values(2,'abc');

insert into test_autoinc(c1,c2) values(3,'abcdd');

insert into test_autoinc(c1,c2) values(4,'abcdd');

insert into test_autoinc(c1,c2) values(5,'abcdd');

1

操作

备注

Master