问题

执行一个增加字段的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.

解释一下就是当执行Oline 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执行失败,报错。

总结

Oline DDL的原理简单一点理解就是将DML操作缓存起来,等到DDL执行完成后重新应用缓存中的DML语句,如果在Oline 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/

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

  1. mysql 报错 Duplicate entry ‘xxx‘ for key ‘字段名‘

    有时候对表进行操作,例如加唯一键,或者插入数据(已经有唯一键),会报错 Duplicate entry...for key...原因是primary key(主键)或unique key(唯一键)的值 ...

  2. alter table add column多个字段_SQL对表中字段的操作 alter

    ALTER TABLE 语句用于在现有表中添加.删除或修改列. 注意不同的数据库的语句有所不一样 增加和删除都基本一致. 进行修改表中字段的时候注意: 本文主要介绍 sqlserver/mysql/o ...

  3. MySQL ALTER TABLE报错Duplicate entry 'xxx' for key 'PRIMARY'解决方法

    在MySQL中执行加字段等操作时可能会报Duplicate entry 'xxx' for key 'PRIMARY'的错,例如: mysql> alter table test add aa ...

  4. Mysql 报错Duplicate entry '值' for key '字段名'的解决

    一.问题: 二.问题解释: Duplicate entry...for key...的错误原因是主键的唯一值重复,在对数据库进行修改.插入操作时,一但主键的唯一值重复就会报此错误,有时在表中存在多个相 ...

  5. mysql 唯一性约束报错_怪异的MySQL Online DDL报错Duplicate entry

    今天线上执行Online DDL的时候发现一个奇怪的报错,觉得比较意义,遂整理如下.线上数据库版本:percona server 5.7.14 报错现场:每次执行的时候重复报错记录都不一样 mysql ...

  6. 报错Duplicate entry ‘值‘ for key ‘字段名‘的解决解决方法

    遇到这种问题, 是你的数据库表那个字段设置了唯一索引.所以这个字段新增的数据不能重复.具体可以打开表,然后点击表设置,具体教程可以看下文章最后 Caused by: com.mysql.jdbc.ex ...

  7. navicat 手动设置索引unique,报错duplicate entry for key

    错误场景: 仅限于手动设置unique时. 在navicat中根据流程: 右键表名 -> 设计表 -> 索引 -> 设置某列为unique -> 保存 错误图示: 错误原因: ...

  8. alter table add column多个字段_ElementUI表格el-table表头固定自适应高度解决方案

    一.前言 ElementUI.iView都以相同的方式提供了表格组件表头固定的方法,即设置组件的height属性.表头固定很重要,就在于当表格数据项很多时,滚动条出现在表格组件内,而不是出现在表格组件 ...

  9. alter table add column多个字段_利用Python将多个excel合并到一个文件中

    数据岗位的小伙伴可能经常会遇到这样一个问题:多个来源返回的数据怎么整合到一个文件中?手动经常会出错,下面介绍一种利用Python处理的方式: 前期准备: 1.多个excel需要进行数据整理,保证文件的 ...

最新文章

  1. 怎样从tensorflow的generator object Estimator.predict at 0x7fb1ecefeaf0中取数据
  2. 一种用XAML写Data Converter的方式
  3. Silverlight 2 相关文章汇总
  4. Boosting for PRML
  5. nssl1467-U【差分】
  6. torch tensor去掉1维_南昌清污机新价格表1_海腾水工
  7. Spark整合ElasticSearch
  8. 手机编译mysql_玩转MySQL 8.0源码编译
  9. 中国计算机学会推荐国际学术会议和期刊目录(2015 年)
  10. 网络编程_手写聊天室_群聊过渡板
  11. 【MS SQL Server】SQL Server2005下载地址
  12. 【图像压缩】基于余弦变换及霍夫曼编码实现jpeg压缩和解压附matlab代码
  13. Slf4j与Log4j的区别
  14. excel如何提取单元格中的数字
  15. python手机号替换_转--Python re模块 验证11位手机号
  16. outlook怎样同步服务器的文件夹,当您使用辅助在 Outlook 邮箱中的文件夹时的性能和同步问题...
  17. 2018全国普通高校学科竞赛排行榜发布
  18. 关于CMD文件中文乱码的解决方案
  19. 小米推迟上市和A股大跌,背后有什么共同原因?
  20. 大龄计算机考研 考研帮,过了40还想考研吗?大龄研究生讲述真实感受

热门文章

  1. 配置STS、Eclipse编写HTML/JS/CSS/JSP页面的自动提示
  2. 苹果手表对比_苹果会手表洗手提醒真正起作用吗
  3. PDF转换word,三种方法在这里
  4. 自动驾驶做“双碳”目标下的现实主义者
  5. Word 2003 视频教程-Word 界面介绍(转)
  6. pdf太大怎么压缩大小,3个pdf文件压缩方法
  7. 2022-05-07每日一题
  8. 百度云盘for Linux安装教程和体验
  9. 请提前布局 Star Trek突破链游全新玩法,市场热度持续高涨
  10. 带动猜你喜欢流量的方法,,如何给新品打标,使得新品快速入池猜你喜欢