mysql做表结构变动的时候遇到的Duplicate entry错误

组内小伙伴问我:erge,我这个表查了只有一条记录,怎么在改表结构的时候会报重复。

我一听,恩,心里就有数了(没他,见的多了,用的多了,写的多了,碰到的多了,踩的坑多)

我给他讲有以下几点原因,还有其他原因请不吝赐教

  • mysql 5.6之后 online DDL引起的(大白话原理在最后)

    解决方案:

    • 锁表
    	# 执行前锁表 尽量在业务低峰期操作
    	LOCK TABLES my_table WRITE;
    	ALTER ...;
    	UNLOCK TABLES;
    
    • 用第三方工具pt-online-schema-change等
  • 触发器之类的关联其他表操作

    解决方案:

    • 查看对应的触发器关联的表处理
  • 可能备份中出现问题

    解决方案:

    • 修复下表
  • id达到最大值

    解决方案:

    • 这个还要说

表数据较多,在执行alter table期间有其他会话执行了造成duplicate entry的语句使online ddl在执行完结构变更回放缓存的时候报错。 Oline DDL的原理简单一点理解就是将DML操作缓存起来,等到DDL执行完成后重新应用缓存中的DML语句,如果在Oline DDL执行过程中,DML操作产生了Duplicate entry错误,并不会直接影响DDL操作,而是在DDL执行完成最终应用DML时报错,导致DDL执行失败。官方认为该问题是一种限制,并不是Bug,所以目前为止还没有得到解决。 只有在唯一键冲突的时候(insert,update)才会影响到DDL,主键冲突没有影响。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章