首页
学习
活动
专区
圈层
工具
发布

MySQL adddrop字段时报主键冲突

问题现象 很多DBA朋友做ddl 变更比如添加、删除字段时,一定概率上会遇到如下报错: Duplicate entry '7458421' for key 'PRIMARY' 错误提示是主键冲突,但是当我们去查询...问题分析 首先我们通过一个思维导图了解一下MySQL online DDL 的过程,大家注意commit阶段,会把ddl 执行期间的记录的 log 重新应用到新的表上。 ?...从官方文档中的描述所说 online ddl 期间,其他会话执行的dml操作造成唯一键冲突的sql会记录到 online log 中,在commit阶段等变更结束之后再应用这些sql会导致报错唯一键冲突...https://bugs.mysql.com/bug.php?...76895 https://bugs.launchpad.net/percona-server/+bug/1445589 关联知识 innodb_online_alter_log_max_size 是MySQL

5.7K21
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    mysql主从延迟案例(有索引但无主键)

    导读mysql的主从延迟问题还是很常见的, 通常都是没得索引或者数据量太大导致的. 如果有索引,选择性不好,还是会导致主从延迟增大....本文主要分享一个 表有索引(where使用了的),但无主键 导致主从延迟增大的案例,并附2种解决方法.模拟环境准备5.7和8.0都可以, 搭建一套主从环境, 参数如下:# hash_scan有BUG(hash...解决方案方案1加主键然后重建主从. 这是最稳妥的方法, 如果数据量太大的话, 也可以选择只重建某张表....';-- 启动主从start slave;最后再校验下数据库的数据是否一致(仅校验无主键的表即可.)...我这里就简单使用checksum table来校验了数据当然是一致的啦(hash碰撞的概率非常低的, 而且hash_scan是8.0的默认选择)总结mysql的表都建议加上主键/唯一键, 实在没得选的,

    79231

    MySQL无主键大表删除导致主从同步延迟的深度分析

    之前我们总结了MySQL主从复制的一些原理、模式、案例,今天我们走个研报的路线,分析一下MySQL无主键大表执行删除操作导致主从延迟的问题。...MySQL无主键大表执行删除操作时,主从同步延迟是数据库运维中常见的棘手问题。...解决方案与优化策略 针对MySQL无主键大表删除导致主从同步延迟的问题,可从以下几个维度实施解决方案: 表结构优化是最根本的解决方法。为无主键表添加主键或唯一索引,可显著提高删除操作的执行效率。...5.7+版本,且事务无锁冲突 5....为避免MySQL无主键大表删除导致主从同步延迟问题再次发生,建议实施以下预防策略: 强制表设计规范是预防此类问题的根本手段。在数据库设计阶段,应强制要求所有表必须有主键或唯一索引,避免无主键表的出现。

    55910

    MySQL 核心模块揭秘 | 32 期 | 插入记录,主键索引冲突加什么锁?

    本文基于 MySQL 8.0.32 源码,存储引擎为 InnoDB。 正文 1....begin; insert into t1(id, i1) values (10, 1010); 因为新插入记录和表中原有记录存在主键冲突,执行 insert 语句之后,报错如下: (1062, "Duplicate...原理分析 insert 语句执行过程中,插入记录到主键索引之前,需要先找插入记录的目标位置。 目标位置为表中主键字段值小于等于新插入记录中主键字段值的最后一条记录之后。...否则,新记录和表中已有记录冲突,不能插入,就可以报错了。 为了防止其它事务更新或者删除这条记录,检查表中记录是否有效之前,InnoDB 会对这条记录加共享普通记录锁。...我们可以模拟下这个场景,创建 2 个 MySQL 连接,分别执行 delete 语句和 insert 语句。

    56510

    Mysql资料 主键

    表中的任何列都可以作为主键,只要它满足以下条件: 1、任何两行都不具有相同的主键值 2、每个行都必须具有一个主键值(主键列不允许NULL值) 除MySQL强制实施的规则外,应该坚持的几个普遍认为的最好习惯为...: 1、不更新主键列的值 2、不重用主键列的值 3、不在主键列中使用可能会更改的值(例如,如果使用一个名字作为主键以标识某个供应商,应该供应商合并和更改其名字时,必须更改这个主键) 总之:不应该使用一个具有意义的...这就要求同一个叶子节点内(大小为一个内存页或磁盘页)的各条数据记录按主键顺序存放,因此每当有一条新的记录插入时,MySQL会根据其主键将其插入适当的节点和位置,如果页面达到装载因子(InnoDB默认为15...2、.如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置: 此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉...如果没有显式地在表定义时指定主键,InnoDB存储引擎会为每一行生成一个6字节的ROWID,并一次作为主键。 mysql 在频繁的更新、删除操作,会产生碎片。而含碎片比较大的表,查询效率会降低。

    6.6K20

    MySQL主键设计盘点

    主键设计和应用原则 除了满足MySQL强制实施的规则(主键不可重复;一行中主键不可为空)之外,主键的设计和应用应当还遵守以下公认的原则: 不更新主键列中的值; 不重用主键列的值; 不在主键列中使用可能会更改的值...3、ID作为主键时在特定的环境会存在一些问题,比如需要排序的时候——UUID是无序的。 4、MySQL官方有明确的建议主键要尽量越短越好,36个字符长度的UUID不符合要求。...5、对MySQL索引不利:作为数据库主键,在InnoDB引擎下,UUID的无序性可能会引起数据位置频繁变动,严重影响性能。...关于MySQL 使用自增ID主键和UUID 作为主键的性能比较可以查看参考【8】。 结论: 1、uuid做主键适用于小规模分布式架构用。...结论: 用自建的id生成器做主键适用于大规模分布式架构 参考: 【1】:红心李 :MySQL主键设计 【2】:Uncle Nucky :MySQL数据库主键设计原则 【3】:ellis:设计套路:Mysql

    6.6K30

    MySQL的主键详解

    表中的任何列都可以作为主键,只要它满足以下主键值规则条件: 任两行不具相同的主键值 每行都必须具有一个主键值(主键列不允许NULL) 这里的规则是MySQL本身强制实施的。...除MySQL强制实施的规则外,还应该坚持的最佳实践: 不更新主键列中的值 不重用主键列的值 不在主键列中使用可能会更改的值 例如,如果使用一个名字作为主键以标识某个供应商,当该供应商合并和更改其 名字时...,必须更改这个主键) 联合主键 好处 可以直观的看到某个重复字段的记录条数 主键A跟主键B组成联合主键 主键A跟主键B的数据可以完全相同,联合就在于主键A跟主键B形成的联合主键是唯一的。...联合主键体现在多个表上,复合主键体现在一个表中的多个字段。 复合主键 主键通常定义在表的一列上,但这并不是必需的,也可使用多个列作为主键。...表的主键含有一个以上的字段组成,不使用无业务含义的自增id作为主键 将多个字段设置为主键,形成复合主键,这多个字段联合标识唯一性,其中,某几个主键字段值出现重复是没有问题的,只要不是有多条记录的所有主键值完全一样

    7.9K20

    MySQL主键约束使用

    MySQL主键约束是一种用于确保表中每行数据的唯一性的限制。每个表只能有一个主键,它可以是一个或多个列。创建表时添加主键约束在创建表时添加主键约束,需要在列名后面添加关键字"PRIMARY KEY"。...在已经存在的表中添加主键约束如果已经存在一个表,但需要将某些列或字段添加主键约束,可以使用ALTER TABLE语句来修改表结构。...主键约束和自增列通常情况下,主键约束通常与自增列一起使用。自增列是指在插入新行时,自动为该行分配一个唯一的值。在MySQL中,可以使用AUTO_INCREMENT关键字来创建自增列。...这意味着在插入数据时,无需提供"id"列的值,MySQL会自动为其分配一个唯一的值。示例假设有一个用户表,其中包含以下列:id、name和email。...以下是如何插入数据的示例:INSERT INTO users (name, email)VALUES ('John', 'john@example.com');在上面的示例中,"id"列是自增列,不需要手动提值,MySQL

    5.1K20

    【云+社区年度征文】测试MySQL主从复制中主库表缺失主键会导致主从延迟的情况

    此外,判断从库有延迟是十分简单的一件事:在从库上通过SHOW SLAVE STATUS,检查Seconds_Behind_Master值即可获取主从复制延迟的秒数。...主从复制延迟,可能的原因有主库和从库方面: ① 主库写binlog不及时 参数sync_binlog控制binlog从内存写入磁盘的控制开关,5.6默认为0,从5.7开始默认为1。...⑤ 表缺乏主键或唯一索引 binlog_format=row的情况下,如果表缺乏主键或唯一索引,在UPDATE、DELETE的时候可能会造成从库延迟骤增。...导致MySQL主从复制延迟的原因有很多,其中一个原因就是大表缺失主键或唯一索引。 今天我们就通过实验的方式来验证这种情况。...四、结论 在MySQL的主从复制架构中,若存在大表,那么一定要有主键或唯一索引,否则将导致很大的主从延迟。

    2.8K311

    Mysql主从

    前提: mysql主从的搭建前提有: 两台虚拟机 两台虚拟机上都装有mysql,并且版本一样,两边的mysql数据库文件一致,mysql的安装方式我在前面博客已经介绍过了。...环境: Host Role IP mysql-1 Master 192.168.30.106 mysql-2 Slave 192.168.30.107 搭建 在主从服务器上都创建一个用户 $ mysql..., mysql如何减少主从复制延迟: 如果延迟比较大,就先确认以下几个因素: 从库硬件比主库差,导致复制延迟 主从复制单线程,如果主库写并发太大,来不及传送到从库 就会导致延迟。...,如果连接建立失败,间隔多久后重试 通常配置以上2个参数可以减少网络问题导致的主从数据同步延迟 MySQL数据库主从同步延迟解决方案 最简单的减少slave同步延时的方案就是在架构上做优化,尽量让主库的...另外就是使用比主库更好的硬件设备作为slave 扩展 主从还能配合MySQL中proxy实现真正意义的读写分离,还能配合keepalived做主从切换高可用,还能配合mysqljump做异地备份,在从库定时物理备份

    4K10

    MySQL为什么需要主键

    MySQL为什么需要主键主键表中每一行都应该有可以唯一标识自己的一列(或一组列)。一个顾客可以使用顾客编号列,而订单可以使用订单ID,雇员可以使用雇员ID或雇员社会保险号。...表中的任何列都可以作为主键,只要它满足以下条件:任何两行都不具有相同的主键值。每个行都必须具有一个主键值(主键列不允许NULL值)这里列出的条件是MySQL本身强制实施的。...除MySQL强制实施的规则外,应该坚持的几个普遍认为的最好习惯为:不更新主键列的值。不重用主键列的值。不在主键列中使用可能会更改的值。比如用用户邮箱当主键,但是用户可能更换邮箱。...如果使用非自增主键:由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置:此时MySQL不得不为了将新记录插到合适位置而移动数据。...如果没有显式地在表定义时指定主键,InnoDB存储引擎会为每一行生成一个6字节的ROWID,并一次作为主键。MySQL在频繁的更新、删除操作时,会产生碎片。而含碎片比较大的表,查询效率会降低。

    3K00

    MySQL主从搭建

    生产环境中一旦与数据(缓存也不例外)扯上关系的一律不由k8s统一管理 因此,别想一键式部署了,只能老老实实单独部署 再此,就记录一下搭建过程,分享给小伙伴们,避免浪费时间 废话不多说,上车 下载 没有安装mysql...=103 log-bin = mysql-bin auto-increment-increment = 2 auto-increment-offset = 1001 2、进入Mysql,分别为二台master...创建各种的用户供对方使用 温馨提示: 本案例为双主从,也就是master同步到node,node同步到master。...单主从,就只需要不执行带*即可 #master的机器上 CREATE USER 'master'@'%' IDENTIFIED BY '123456';   #node的机器上(*) CREATE USER....000026',MASTER_LOG_POS=0; slave start; show slave status; 4、数据库主从日志很大 设置只保留30天的binlog (临时,重启mysql

    3.7K10

    Mysql:小主键,大问题

    本篇讲解 Mysql 的「主键」问题,从「为什么」的角度来了解 Mysql 主键相关的知识,并拓展到主键的生成方案问题。再也不怕被问到 Mysql 时只知道 CRUD 了。...这就要求同一个叶子节点内(大小为一个内存页或磁盘页)的各条数据记录「按主键顺序存放」,因此每当有一条新的记录插入时,MySQL 会根据其主键将其插入适当的节点和位置,如果页面达到装载因子(InnoDB...一般情况下,我们都使用 Mysql 的自增 ID,来作为表的「主键」,这样简单,而且从上面讲到的来看,性能也是最好的。...Mongodb ObjectId Mongodb 为防止主键冲突,设计了一个 ObjectId 作为主键 id。它由一个 12 字节的十六进制数字组成,其中包含以下几部分: Time:时间戳。...上面的 Machine 是为了确保在不同机器产生的 objectId 不冲突,而 pid 就是为了在同一台机器不同的 mongodb 进程产生的 objectId 不冲突。 INC:自增计数器。

    5.5K10
    领券