之前在操作数据的时候,我在思考如何编写SQL,但是不小心按下了F8执行了drop语句,不小心删除了表,不过之后被我恢复了,但是之后我又不小心删错了表数据,虽然很快恢复了,但是我也找了几篇博客对比,虽然都是发生开发环境,但是找起来也很麻烦,因为以前都没有发生过这种情况,经过这两次的遭遇,我打算做一下总结,有备无患嘛。
备注:以下的方法仅仅适用于oracle数据库,其他数据库不适用
首先说误删数据,因为oracle数据库有闪回功能,所以有两种方案解决此问题:
一、误删数据根据时间来恢复
删除前的数据:
删除后的数据:
接下来我们就开始恢复数据
1、查询数据库当前时间,因为有些数据库的时间跟你电脑的系统时间不一致的(如下图),我们需要准确的时间
select sysdate from dual;
2、查询删除数据时间点之前的数据(此时查出来的数据可以加上条件来进行查询,以便查看你删除的数据是否在这个时间点存在)
select * from 表名 as of timestamp to_timestamp('2021-01-31 22:22:11','yyyy-mm-dd hh24:mi:ss');
执行以下语句可以查看全部的数据或者查看自己删除掉的数据,都是为了得到准确的时间点来恢复数据。
执行:select * from table_test as of timestamp to_timestamp('2021-01-31 22:20:11','yyyy-mm-dd hh24:mi:ss');
执行:select * from table_test as of timestamp to_timestamp('2021-01-31 22:20:11','yyyy-mm-dd hh24:mi:ss') where id in ('3','4','5');
3、拿到恢复的时间点来恢复数据
flashback table 表名 to timestamp to_timestamp('2021-01-31 22:20:11','yyyy-mm-dd hh24:mi:ss');
执行:flashback table table_test to timestamp to_timestamp('2021-01-31 22:20:11','yyyy-mm-dd hh24:mi:ss');
执行完上面这段语句,我们就能恢复数据了,但是我们执行之后可能会报错:ORA-08189:因为未启用行移动功能,不能闪回表;
碰到这种情况,我们直接执行下面的语句:
alter table 表名 enable row movement;
执行:alter table table_test enable row movement;
执行完之后我们再执行flashback开头那段语句就能恢复数据了。
二、误删数据根据数据库SCN恢复
这里就不截图了,都是利用了oracle的闪回功能,只是方式不同,本人比较喜欢用时间来恢复。
1、查询当前数据库的scn
select current_scn from v$database;(不能执行的话,切换到sys用户或system用户查询)
查询到的当前值为:285095103
2、缩小SCN号查询被删除表数据(若无数据继续缩小SCN,由于数据库操作不止一人,SCN号变化比较多,可以多缩小几个号)
select * from 表名 as of scn 285095100;
执行:select * from table_test as of scn 285095100;
3、恢复数据
flashback table 表名 to scn 285095100;
执行:flashback table table_test to scn 285095100;
执行完上面这段语句,我们就也能恢复数据。若报错:ORA-08189:因为未启用行移动功能,不能闪回表;方法同方法一一样操作即可。
最后说误删表的情况,没有像误删表数据那样需要找时间或者scn,需要注意的是尽快恢复,时间长了oracle就不保存原来的数据了!!!
3、误删表恢复
当我们不小心用drop语句删除了表,我们将表以及数据都清除了,此时我们不用慌,只要我们执行下面的语句,就能恢复了。
flashback table 表名 to before drop;
执行:flashback table table_test to before drop;
然后再次查询,发现表以及数据都恢复到删除之前了。
oracle误删数据和误删表的恢复方法到这里就结束了。