在今年3月份的一次发布中,需要删除一张业务表中某一天2点到7点的数据,同事写了如下的sql:
DELETE FROM cr_guide_customer_rel WHERE '2019-03-06 01:59:59'< create_time < '2019-03-06 07:00:00'
发布之前看到这条sql感觉有点奇怪,但是没有具体进行测试。
发布完第二天产品反应某个功能突然没有数据了,我们到线上库里一查发现只有3月6号7点以后的数据了,之前的数据都被误删了,后来发现就是这条sql引起的,'2019-03-06 01:59:59'< create_time < '2019-03-06 07:00:00'这个条件其实等同于1=1,导致严重的生产事故!
当晚进行数据恢复,恢复过程如下:
1、首先建一张新表,新表的结构与老表结构一致
2、让DBA将数据先恢复到新建的表中,由于恢复的数据与目前线上已有的数据一定有重复数据,需要去重
3、对比新表和线上表的数据差异,将新表中多余的数据删除,对比删除语句如下:
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';
4、将新表中剩余的数据重新导入到线上的表中,如此完成数据恢复!