MySQL 新增字段(alter table add column),报错:Duplicate entry

article/2025/10/6 0:56:51

问题

执行一个增加字段的DDL语句脚本时,报错,错误如下:

Error 1062: Duplicate entry 'c51d3db8-59a5 2022-06-28 17:59:59' for key 'uniq_material_date'

重复执行报相同的错误。根据错误提示的条件去数据库中查询却只能查到一条记录,并没有重复记录。 DDL脚本无法执行,影响后续上线步骤。目前已知的信息只有:

DDL语句脚本中只有两条DDL语句,且都是添加字段的语句。
表数据量是56w,脚本正常运行十几秒内即可完成。

原因定位

Google键入关键字:mysql alter table add column duplicate entry,搜索结果中有一个链接:MySQL Bugs:#76895:Adding new column OR Drop column causes duplicate PK error,详细如下:

When running an online DDL operation, the thread that runs the ALTER TABLE statement applies an online log of DML operations that were run concurrently on the same table from other connection threads. When the DML operations are applied, it is possible to encounter a duplicate key entry error (ERROR 1062 (23000): Duplicate entry), even if the duplicate entry is only temporary and would be reverted by a later entry in the online log. This is similar to the idea of a foreign key constraint check in InnoDB in which constraints must hold during a transaction.

解释一下就是当执行Online DDL操作时,如果此时有DML执行,MySQL会将DML缓存(该缓存大小由变量 innodb_online_alter_log_max_size控制,默认128M)起来,等DDL执行完成后再将缓存中的DML重新应用到表上。 如果有别的线程执行了DML操作,在DDL完成后,应用DML时,可能会出现duplicate entry错误。

实验验证

线上报错的表(report_power_eqm)只有一种操作会写入或更新数据:insert into … on duplicate key… ,且报Duplicate entry的字段上有唯一索引。如果没有冲突的记录则插入,否则就更新。找一张测试表来验证,执行ALTER TABLE ADD COLUMN操作,并同时执行insert into…on duplicate key…操作,观察DDL语句是否会有报错。

1 准备一张表,通过脚本循环插入1000w数据

2 先执行添加字段sql,再执行insert into … on duplicate key 操作,观察执行结果

在这里插入图片描述

复现了线上的问题现象,那说明当时线上就是因为DML更新了相同的唯一属性字段键值导致DDL执行失败,报错。

总结

Online DDL的原理简单一点理解就是将DML操作缓存起来,等到DDL执行完成后重新应用缓存中的DML语句,如果在Online DDL执行过程中,DML操作产生了Duplicate entry错误,并不会直接影响DDL操作,而是在DDL执行完成最终应用DML时报错,导致DDL执行失败。

在MySQL Bug网站上,官方人员回复该现象并不是Bug,而是一种限制。在测试insert into … on duplicate key…以及update和insert语句时,如果直接执行DML操作,客户端会直接返回报错,但是从现象上看MySQL仍然将报错的DML语句放到了Oline DDL的缓存中。如果直接将报错语句从缓存中去除则不会影响DDL的正常执行,个人感觉要合理一些。

解决方案

执行DDL时,期间产生的DML会生成重复数据,无法通过MySQL的唯一约束校验,MySQL里会报错,最终导致DDL失败。因此可以在执行DDL期间禁止该类DML执行,这样就可以正常执行DDL了,具体步骤如下:

1 修改业务代码,确保没有生成重复数据的DML(DML改动的业务数据是统计能耗的变化量,短期内没有记录不影响最终的数据统计),发布服务

2 执行添加字段sql

ALTER TABLE `report_power_eqm`
ADD COLUMN `electricity_cost` decimal(20,2) DEFAULT NULL COMMENT '用电电费' after `consumption`;
ALTER TABLE `report_power_org`
ADD COLUMN `electricity_cost` decimal(20,2) DEFAULT NULL COMMENT '用电电费' after `consumption`;

3 回滚业务代码的改动,正常执行业务需要的DML,发布服务

其他

ps:推荐一个查询MySQL问题的官方网站:MySQL Bugs,可以查询关于MySQL中几乎所有的问题。

参考资料

http://blog.itpub.net/28218939/viewspace-2654121/


http://chatgpt.dhexx.cn/article/g5vFQr3v.shtml

相关文章

mysql新增、修改表字段

一、新增字段 说明:以下语句关键字COLUMN,都可以省略,“ACT_AAA”是表名 格式 ALTER TABLE 表名 ADD COLUMN 字段名称 字段类型(字段长短-选填) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL&#xf…

ln命令使用

Linux中ln是一个非常重要的一个命令,主要是将两个文档进行连接,创建一个连接关系 连接档:ln 使用ln可以在两个文件之间建立关联,就类似Windows下的快捷方式,连接有两种方式 Hard Link(硬式连接或实际连接…

Linux ln 命令是什么?C/C++代码实现

在Linux中,在命令行上工作时,需要在文件之间创建链接,将文件名与文件数据相关联。这可以使用名为 ln 的专用命令来实现。 什么是链接? 在讨论 ln 命令之前,让我们先讨论一下链接命令,什么是链接&#xff…

Linux命令详解(13)- ln命令

ln是英文“link files”的缩写,命令不算复杂,但是非常重要。 语法: ln option Source file or directory Destination file or directory 这里先讲下两个概念。 1.软连接 软链接类似于windows系统中的快捷方式。创建之后&#xff0c…

linux ln 远程,Linux 软连接 (ln命令)

这是linux中一个非常重要命令。它的功能是为某一个文件在另外一个位置建立一个同不的链接,这个命令最常用的参数是-s,具体用法是:ln -s 源文件 目标文件。 当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个…

linux 中的 ln 命令,Linux ln命令操作指南

ln是Linux系统中一个重要的命令,能够为文件建立链接,保持链接文件的同步性,下面小编就给大家介绍下Linux下如何使用ln命令,通过实例来详细了解。 1. 使用ln命令给档案创建symbolic link。 linux系统下的symbolic link类似于window…

Linux ln命令详解

ln命令来自于英文单词link的缩写,中文译为“链接”,其功能是用于为某个文件在另外一个位置建立同步的链接。Linux系统中的链接文件有两种形式,一种是硬链接(hard link),另一种是软链接(symbolic…

ln命令应用

记录:352 场景:在CentOS 7.9操作系统上,使用ln命令创建软链接(symbolic links)和硬链接(hard links)。解决:Too many levels of symbolic links。 版本: 操作系统:CentOS 7.9 1.命令应用 (1)目录创建软…

linux ln命令

ln 命令的功能是在不同的位置创建一个链接,又分软链接和硬链接,一般软链接使用较多。 硬链接:ln 源文件 链接文件 是在选定的位置生成一个文件的镜像,镜像文件与源文件同样大小 软连接:ln –s 源文件 链接文件 是…

ln命令详解

Linux文件系统中,有所谓的链接(link),我们可以将其视为档案的别名,而链接又可分为两种 : 硬链接(hard link)与软链接(symbolic link),硬链接的意思是一个文件可以有多个名称,而软链接的方式则是产生一个特殊的文件&…

ubuntu18.04虚拟机崩掉导致硬盘错误,提示fsck manually

问题描述: 可能是一次性复制的文件太大了,导致内存吃紧,Windows10直接崩掉,接着就进入了我经常看到的那个蓝屏错误提示界面,有个正在恢复的百分数进度提示。 这个问题我经常碰到,或许是网页开多了吧&…

dos磁盘管理命令

dos磁盘管理命令 前言 磁盘管理命令用于日常的磁盘维护。DOS命令行提供了多种文件管理命令用于设置和管理磁盘列表。由于很多磁盘在没有安装图形界面的时候就需要对其进行操作,所以掌握DOS命令行下的磁盘管 理命令对系统管理员是十分必要的。 磁盘管理命令 以下…

centos 硬盘 修复

xfs_repair -n /dev/sdb centos 硬盘 修复 sudo parted -l sudo parted -l [localhost home]$ sudo parted -l Model: Dell VIRTUAL DISK (scsi) Disk /dev/sda: 1000GB Sector size (logical/physical): 512B/512B Partition Table: msdos Disk Flags:Number Start End…

电脑修复损坏文件--修复命令;系统盘磁盘空间不足

目录 sfc/scannow--修复损坏的系统文件命令解析command parse步骤 命令修复磁盘;磁盘空间的释放输入“sfc /purgecache”命令(不含双引号,下同)输入“cleanmgr”命令输入“CHKDSK D:/F”,修复D驱动器号 sfc/scannow–修…

mac 磁盘修复

1、使用磁盘工具 2、终端查看并修复 diskutil listdiskutil verifyVolume disknamediskutil repairDisk diskname

如何扫描和修复 Linux 磁盘错误

在本文中,将学习如何使用 fsck 和 xfs_repair 命令修复 Linux 磁盘错误。 什么是FSCK? fsck(文件系统一致性检查)是用于检查Linux操作系统文件系统一致性的工具。 列出 Linux 磁盘分区和类型: 首先,需要…

计算机磁盘修复工具,chkdsk磁盘修复工具

chkdsk磁盘修复工具是一款非常具有专业性、权威的工具,使用chkdsk磁盘修复工具时你不可以有任何其他操作(停止运行任何程序),只能锁定磁盘(也就是强制卸下该卷),如果出现其他程序在修复时运行,就需要你重启电脑后重新修复了。硬盘坏道修复工具使用简单且安全性高,推荐使用…

ubuntu磁盘修复

输入命令ls的时候遇到错误 ls: reading directory .: Input/output error 用 dmesg 查看,发现io错误 先umount磁盘 cd /mnt umount diske 遇到 umount: /mnt/diske: target is busy. 查看谁在用 ,并kill掉,再次umount lsof /mnt/disk 然…

磁盘检查清理修复命令

Cmd命令在桌面版windowsPC和大多数windows server下都是通用的,所以掌握命令对于使用者非常重要; 经常会遇到检查硬盘、清理磁盘的时候,但是使用360、金山等杀毒软件会有一些安全隐患,尤其是大企业有自己的杀毒软件不允许使用其他的带有插件或广告的杀毒…

windows自带磁盘修复命令chkdsk的使用方法

在电脑使用过程会因突然断电或者是非正常关机等原因导致磁盘受损,这里介绍Windows系统自带chkdsk命令修复硬盘。 2022.10.26补充,专业硬盘维修的朋友告诉我此命令不要随意使用,尤其硬盘已经有坏道,用该方法可能导致更严重的问题。…