天天看点

oracle误删数据和误删表的恢复方法

之前在操作数据的时候,我在思考如何编写SQL,但是不小心按下了F8执行了drop语句,不小心删除了表,不过之后被我恢复了,但是之后我又不小心删错了表数据,虽然很快恢复了,但是我也找了几篇博客对比,虽然都是发生开发环境,但是找起来也很麻烦,因为以前都没有发生过这种情况,经过这两次的遭遇,我打算做一下总结,有备无患嘛。

备注:以下的方法仅仅适用于oracle数据库,其他数据库不适用

首先说误删数据,因为oracle数据库有闪回功能,所以有两种方案解决此问题:

一、误删数据根据时间来恢复

删除前的数据:

oracle误删数据和误删表的恢复方法

删除后的数据:

oracle误删数据和误删表的恢复方法

接下来我们就开始恢复数据

1、查询数据库当前时间,因为有些数据库的时间跟你电脑的系统时间不一致的(如下图),我们需要准确的时间

select sysdate from dual;

oracle误删数据和误删表的恢复方法

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');

oracle误删数据和误删表的恢复方法

执行: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');

oracle误删数据和误删表的恢复方法

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:因为未启用行移动功能,不能闪回表;

oracle误删数据和误删表的恢复方法

碰到这种情况,我们直接执行下面的语句:

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语句删除了表,我们将表以及数据都清除了,此时我们不用慌,只要我们执行下面的语句,就能恢复了。

oracle误删数据和误删表的恢复方法

flashback table 表名 to before drop;

执行:flashback table table_test to before drop;

然后再次查询,发现表以及数据都恢复到删除之前了。

oracle误删数据和误删表的恢复方法

oracle误删数据和误删表的恢复方法到这里就结束了。