问题现象
很多DBA朋友做ddl 变更比如添加、删除字段时,一定概率上会遇到如下报错:
Duplicate entry '7458421' for key 'PRIMARY'
错误提示是主键冲突,但是当我们去查询 id= 7458421 时,并无此记录。是不是很奇怪?遇到这种情况,一般有如下场景:
1 表具有一个或者多个唯一键。
2 表比较大,执行DDL耗时超过数十秒。
3 表的insert 操作比较频繁。
问题分析
首先我们通过一个思维导图了解一下MySQL online DDL 的过程,大家注意commit阶段,会把ddl 执行期间的记录的 log 重新应用到新的表上。
从官方文档中的描述所说 online ddl 期间,其他会话执行的dml操作造成唯一键冲突的sql会记录到 online log 中ÿ