之前在操作数据的时候,我在思考如何编写SQL,但是不小心按下了F8执行了drop语句,不小心删除了表,不过之后被我恢复了,但是之后我又不小心删错了表数据,虽然很快恢复了,但是我也找了几篇博客对比,虽然都是发生开发环境,但是找起来也很麻烦,因为以前都没有发生过这种情况,经过这两次的遭遇,我打算做一下总结,有备无患嘛。
删除前的数据:
删除后的数据:
接下来我们就开始恢复数据
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开头那段语句就能恢复数据了。
这里就不截图了,都是利用了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:因为未启用行移动功能,不能闪回表;方法同方法一一样操作即可。
当我们不小心用drop语句删除了表,我们将表以及数据都清除了,此时我们不用慌,只要我们执行下面的语句,就能恢复了。
flashback table 表名 to before drop;
执行:flashback table table_test to before drop;
oracle误删数据和误删表的恢复方法到这里就结束了。