一、MySQL主流DDL方式
MySQL目前主要有三种DDL方式,MySQL原生的DDL,pt-osc和gh-ost,介绍文章如下:文章来源:https://www.toymoban.com/news/detail-461110.html
- MySQL online ddl与快速加列
- pt-osc/gh-ost原理
- MySQL online DDL的两个坑
从gh-ost和pt-osc的原理上来讲,全量都是通过insert ignore拷贝到新表,然后增量数据通过触发器或者binlog的方式merge到新表中,这样的话在以下三种场景会出现数据丢失:文章来源地址https://www.toymoban.com/news/detail-461110.html
- 新加字段,并对该字段添加唯一索引;如果这时候使用 gh-ost 变更,最后只会剩下一条记录
- 原表存在重复值,如下数据表;如果这时候使用 gh-ost变更,就会丢弃重复记录
- 改表过程中新写(包含更新)的数据出现重复值,如果这时候使用 gh-ost 变更,在拷贝原表数据期间,可能会覆盖重复数据
方案 | 是否丢数据 | 建议 |
---|---|---|
原生ONLINE DDL | 不丢数据 | 适合小表,及对从库延迟没要求的场景 |
pt-osc | 可能丢数据,无辅助功能可以避免丢数据的场景 | 不适合添加唯一索引 |
gh-ost | 可能丢数据,有辅助功能可以避免部分丢数据的场景 | 适合添加唯一索引 |
二、解决方案
- 新加字段,并对该字段添加唯一索引;如果这时候使用 gh-ost 变更,最后只会剩下一条记录
- 禁止添加唯一索引与其他改表动作同时使用
- 原表存在重复值,如下数据表;如果这时候使用 gh-ost变更,就会丢弃重复记录
- 可以采用gh-ost的hook 功能辅助添加唯一索引,在改表前先校验待添加唯一索引的字段的数据唯一性
- 改表过程中新写(包含更新)的数据出现重复值,如果这时候使用 gh-ost 变更,在拷贝原表数据期间,可能会覆盖重复数据
- 可以采用gh-ost的hook 功能添加唯一索引,在全量拷完切表前校验待添加唯一索引的字段的数据唯一性
https://github.com/github/gh-ost/blob/f334dbde5ebbe85589363d369ee530e3aa1c36bc/doc/hooks.md
到了这里,关于MySQL新增唯一索引造成数据丢失问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!