MySQL新增唯一索引造成数据丢失问题

这篇具有很好参考价值的文章主要介绍了MySQL新增唯一索引造成数据丢失问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、MySQL主流DDL方式

  MySQL目前主要有三种DDL方式,MySQL原生的DDL,pt-osc和gh-ost,介绍文章如下:

  • 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模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Mysql 索引(三)—— 不同索引的创建方式(主键索引、普通索引、唯一键索引)

    了解了主键索引的底层原理,主键索引其实就是 根据主键字段建立相关的数据结构 (B+树),此后在 使用主键字段作为条件查询时,会直接根据主键查找B+树的叶子结点。 除了 主键索引外,普通索引和唯一键索引也是如此,只不过普通索引要稍微绕一点,下面会具体介绍。

    2024年02月03日
    浏览(29)
  • MySQL - 批量插入唯一索引冲突避免办法

    我们在进行大批量的数据插入时,遇到唯一索引冲突是经常的事,报错如下: 在MySQL中有4种方法可以避免唯一索引冲突 (一)导入差异数据,忽略重复数据,IGNORE INTO的使用 (二)导入并覆盖重复数据,REPLACE INTO 的使用 (三)导入保留重复数据未指定字段,INSERT INTO ON DU

    2024年02月01日
    浏览(34)
  • 【后端面经】MySQL主键、唯一索引、联合索引的区别和作用

    目录 0. 简介 1. 主键 2. 唯一索引 3. 联合索引 4. 索引对数据库操作的影响 5. 其他索引 5.1 普通索引 5.2 全文索引 5.3 前缀索引 6. 总结 7. 参考资料 索引是一类特殊的 文件 ,用来存储检索信息,使数据库查找更加快速。 主键是一类特殊的唯一索引,选择某一列元素作为主键,用

    2024年02月09日
    浏览(35)
  • mysql‘逻辑删除‘和‘唯一索引‘冲突的解决方案

    在user表中将name字段设置唯一索引,添加逻辑删除字段del_flag(1为删除,0为未删除)之后,将name=张四的字段删除,再添加一个name=张四的记录则会出现冲突 删除的时候将del_flag设置为null,未删除时候为0,冲突解决 在配置文件中这样配置:

    2024年02月10日
    浏览(31)
  • MySQL——插入加锁/唯一索引插入死锁/批量插入效率

    本篇主要介绍MySQL跟加锁相关的一些概念、MySQL执行插入Insert时的加锁过程、唯一索引下批量插入可能导致的死锁情况,以及分别从业务角度和MySQL配置角度介绍提升批量插入的效率的方法; 在介绍MySQL执行插入的加锁过程之前,先复习下几种跟锁相关的概念; 快照读 InnoDB 利

    2024年02月12日
    浏览(29)
  • MyBatisPlus解决逻辑删除与唯一索引的兼容问题

    比如有张用户表,在插入或者更新数据的时候,我们需要 用户名称 (username),不能重复。 我们首先考虑的是给该字段创建唯一索引 似乎这样就可以了,然而事情并没有那么简单。 因为我们表中的数据在删除的时候不会真的的删除,而是采用逻辑删除,会有一个 deleted 字段使用

    2023年04月13日
    浏览(53)
  • v-if与v-show造成部分元素丢失的问题——v-if复用元素问题

    在写tab切换时遇到了一个问题,以下为简化后的问题所在的代码: 当页面加载时,先向id为 content 的div中添加了一些元素: 如果当 tabIndex 为2时执行 addContent() ,上述 123456789 能够正常显示; 但如果: 在此时将 tabIndex 改为1,再将 tabIndex 改为2, 或者在 tabIndex 不为2时执行 add

    2023年04月13日
    浏览(34)
  • mysql 为大表新增字段或索引

    mysql 为大表增加或增加索引等操作时,直接操作原表可能会因为执行超时而导致失败。解决办法如下。 (1) 建新表 -复制表A 的数据结构,不复制数据 (2) 加字段或索引 -表B加上新字段或索引 (3) 导数据到新表 -把原有数据导入新表           未新增字段时      

    2024年01月18日
    浏览(28)
  • 【问题解决】容器部署MySQL的数据在docker commit导出的镜像中丢失

    最近公司有个甲方项目参加竞赛,要求在(基于kubeflow/arena)平台上部置应用,可以将MySQL打包在应用一起,也可以分开部署,没有提供volume相关的支持。大意是可以把初始好的数据直接拿到平台上。 经过本人在Linux虚机中启动MySQL容器导入数据再 docker commit 出镜像部署到平台上

    2024年02月11日
    浏览(28)
  • 初识mysql数据库之索引概念与磁盘效率问题

    目录 一、索引的概念及作用 二、实际看看索引的效率提升 三、认识磁盘 1. 简单了解磁盘 2. 数据库文件存储位置 3. 定位扇区 4. 数据读取效率问题 5. 磁盘随机访问与磁盘连续访问 5.1 随机访问 5.2 连续访问 四、mysql与磁盘的交互 五、建立共识  索引,其实就是用于 提高数据

    2024年02月16日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包