对异常更新/删除数据进行恢复

前提:有备份。

问题:某个库是生产库,经常大量插入数据、修改数据。然后由于某个人误操作,将其中某个字段刷成某个字段或大批量删除字段。
如何恢复?

小表快速恢复:
第一,备份误操作后主表。

第二,定位误操作的列和筛选条件。

第三、通过UPDATE刷新误操作的键值。
比如说:有两个表A,备份为A1,有主键K,列a
忘了加where条件,执行了:

UPDATE A set a= 1

然后,通过主键刷新:

update A,A1
set A.a=A1.a
where A.K=A1.K

这样就可以恢复80%。

剩下的数据是没备份的。

如果是误删除。
定位删除的SQL:
比如写了:

delete from A where a=1;

如果删除干净那很简单,如果只删除了一部分

从备份表里面写select

select * from A1 where a=1;

然后insert

insert into A 
select * from A1 where a=1;

如果是重要的表的话:

第一,备份误操作后数据库(如果是小表的话)

第二,定位误操作SQL。

第三,(现在基本上所有的表都有唯一主键)
将误操作行数据的行数导到另外一个表。
细节:比如误操作UPDATE,把UPDATE换成select在历史表查询。

比如:这有一个SQL:
正确的是:

UPDATE table1 set c = NULL where a =1 and b=1; 

误写成:

UPDATE table1 set c = NULL where a =1; 

然后在备份表table2中,查询SQL:

select * from table2 where a=1;

第四,如果是误操作UPDATE的话:
执行UPDATE从备份刷

update table1,table2 set table1.c=table2.c
where table1.key=table2.key
and a=1

误操作是delete,那就是insert备份语句。

insert into table1 select * from table2 where a=1;

这样绝大多数错误就清除了。
如果一个表只有INSERT,这个问题就已经解决了。
(假如没有人修改数据)

TIP:假如没有备份怎么办?等着呗。
假如备份比较老怎么办?等着呗。
有啥办法啊???????

第五,手工查询没有备份的数据
我们假设表中有自增主键(常见的INSERT)
有时间参数。

selecct * from table1 where key>1000 and a=1;

然后呢,有啥办法?
如果是UPDATE
第一,啥都不做,等着。
第二,反刷回去吧(如果运气不好会有误伤)
第三,手工识别。

如果是delete,等着。

没办法啊,没备份。
选择损失最小的那个。

第六,打补丁。
如果是UPDATE,会有这么一个情况:顾客在T2-T3刷新了a字段。
当然,不会很多。
T1-T2的数据是肯定找不回的。但是T2-T3修改的字段还在数据库里。

逻辑上这么做:
误操作后数据和条件联查

select * from table1 where c!=1 and a=1;

查到后,刷(我的第一步是:先备份主表,管这些可能存在的数据的死活,时间是第一位的)
查到后,刷。

然后,检查。

一个主表备份,一个备份,反复检查不同。
问题解决以后,有大把的时间查看问题所在、上网查询资料。几十个几百个数据,能恢复 就恢复,恢复不了就等着。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值