记一次线上表数据误删恢复过程

在今年3月份的一次发布中,须要删除一张业务表中某一天2点到7点的数据,同事写了以下的sql:sql

DELETE FROM cr_guide_customer_rel WHERE '2019-03-06 01:59:59'< create_time < '2019-03-06 07:00:00'ide

发布以前看到这条sql感受有点奇怪,可是没有具体进行测试。测试

发布完次日产品反应某个功能忽然没有数据了,咱们到线上库里一查发现只有3月6号7点之后的数据了,以前的数据都被误删了,后来发现就是这条sql引发的,'2019-03-06 01:59:59'< create_time < '2019-03-06 07:00:00'这个条件其实等同于1=1,致使严重的生产事故!ui

 

当晚进行数据恢复,恢复过程以下:产品

一、首先建一张新表,新表的结构与老表结构一致io

二、让DBA将数据先恢复到新建的表中,因为恢复的数据与目前线上已有的数据必定有重复数据,须要去重gui

三、对比新表和线上表的数据差别,将新表中多余的数据删除,对比删除语句以下:im

DELETE bak
FROM
    cr_guide_customer_rel AS origin,
    cr_guide_customer_rel_bak AS bak
WHERE
    origin.staff_id = bak.staff_id
AND origin.cust_no = bak.cust_no
AND origin.relation_type = bak.relation_type
AND origin.delete_flag = bak.delete_flag
AND origin.business_type = '1';数据

四、将新表中剩余的数据从新导入到线上的表中,如此完成数据恢复!
 guide

相关文章
相关标签/搜索