• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    MySQL使用Replace操作时造成数据丢失的问题解决

    前言

    公司开发人员在更新数据时使用了 replace into 语句,由于使用不当导致了数据的大量丢失,到底是如何导致的数据丢失本文对此进行分析。

    一、问题说明

    公司开发人员在更新数据时使用了 replace into 语句,由于使用不当导致了数据的大量丢失,到底是如何导致的数据丢失现分析如下。

    二、问题分析

    a. REPLACE 原理

    REPLACE INTO 原理的官方解释为:

    REPLACE works exactly like INSERT, except that if an old row in the table has the same value as a new row for a PRIMARY KEY or a UNIQUE index, the old row is deleted before the new row is inserted.

    如果新插入行的主键或唯一键在表中已经存在,则会删除原有记录并插入新行;如果在表中不存在,则直接插入

    地址:https://dev.mysql.com/doc/refman/5.6/en/replace.html

    b. 问题现象

    丢失数据的表结构如下:

    CREATE TABLE `active_items` (

    执行的replace语句如下(多条):

    REPLACE INTO active_items(ad_id,score) VALUES('XXXXXXX', 1800);

    通过查询binlog找到执行记录,部分如下:

    ### UPDATE `items`.`active_items`
    ### @21=0 /* TINYINT meta=0 nullable=0 is_null=0 */

    操作的ad_id已经存在,因此先删除后插入,可以看到除了指定的 ad_id,score,其他字段都变为默认值,导致原有数据丢失(虽然在日志中转为了update)

    c. 对比测试

    接下来我进行了如下测试:

    综上所述,说明确实是删除一行,插入一行

    三、数据恢复

    数据丢失或数据错误后,可以有如下几种方式恢复:

    1. 业务方自己写脚本恢复
    2. 通过MySQL的binlog查出误操作sql,生成反向sql进行数据恢复(适合sql数据量较小的情况)
    3. 通过历史备份文件+增量binlog将数据状态恢复到误操作的前一刻

    四、问题扩展

    通过上述分析可以发现,REPLACE 会删除旧行并插入新行,但是binlog中是以update形式记录,这样就带来另一个问题:

    从库自增长值小于主库

    1. 测试

    a. 主从一致:

    主库:

    mysql> show create table tG

    从库:

    mysql> show create table tG

    b. 主库REPLACE:

    主库:

    mysql> replace into t (a,b)values(1,7);

    从库:

    mysql> show create table tG

    注意此时主从两个表的AUTO_INCREMENT值已经不同了

    c. 模拟从升主,在从库进行INSERT:

    mysql> insert into t (a,b,c)values(4,4,4);

    从库插入时会报错,主键重复,报错后AUTO_INCREMENT会 +1,因此再次执行就可以成功插入

    2. 结论

    这个问题在平时不会有丝毫影响,但是:

    如果主库平时大量使用 REPLACE 语句,造成从库 AUTO_INCREMENT 值落后主库太大,当主从发生切换后,再次插入数据时新的主库就会出现大量主键重复报错,导致数据无法插入。

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

    您可能感兴趣的文章:
    • 解决docker重启redis,mysql数据丢失的问题
    • 防止服务器宕机时MySQL数据丢失的几种方案
    • MySQL 丢失数据的原因及解决
    • MySQL 数据丢失排查案例
    上一篇:MySQL 数据库铁律(小结)
    下一篇:Mysql在线回收undo表空间实战记录
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    MySQL使用Replace操作时造成数据丢失的问题解决 MySQL,使用,Replace,操作,时,