前提:有备份。
问题:某个库是生产库,经常大量插入数据、修改数据。然后由于某个人误操作,将其中某个字段刷成某个字段或大批量删除字段。
如何恢复?
小表快速恢复:
第一,备份误操作后主表。
第二,定位误操作的列和筛选条件。
第三、通过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;
查到后,刷(我的第一步是:先备份主表,管这些可能存在的数据的死活,时间是第一位的)
查到后,刷。
然后,检查。
一个主表备份,一个备份,反复检查不同。
问题解决以后,有大把的时间查看问题所在、上网查询资料。几十个几百个数据,能恢复 就恢复,恢复不了就等着。