从Oracle10开始就有闪回,这个功能多次起到力挽狂澜的作用。比如
有两个表,分别是sh1和sh2。
SQL> create table sh1 (a int,b int);
表已创建。
SQL> create table sh2 (a int,b int);
表已创建。
====================
分别向两个表中写入数据:
SQL> insert into sh1 values (1,1);
已创建 1 行。
SQL> insert into sh1 values (2,2);
已创建 1 行。
SQL> insert into sh2 values (3,3);
已创建 1 行。
SQL> commit;
提交完成。
++++++++
此时sh1中有2行数据,sh2中有1行数据。
SQL> select * from sh1;
A B
---------- ----------
1 1
2 2
SQL> select * from sh2;
A B
---------- ----------
3 3
+++++++++++++++++++++++++==
传统的误删除表后,执行闪回sh2表的数据被找回来了。
SQL> drop table sh2;
表已删除。
SQL> select * from sh2;
select * from sh2
*
第 1 行出现错误:
ORA-00942: 表或视图不存在
SQL> flashback table sh2 to before drop;
闪回完成。
SQL> select * from sh2;
A B
---------- ----------
3 3
+=============================
而如果被drop的表,重新建立了。那么在执行闪回时候就出错了。
SQL> drop table sh1;
表已删除。
SQL> create table sh1 (a int,b int);
表已创建。
SQL> insert into sh1 values (3,3);
已创建 1 行。
SQL> commit;
提交完成。
SQL> flashback table sh1 to before drop;
flashback table sh1 to before drop
*
第 1 行出现错误:
ORA-38312: 原始名称已被现有对象使用
遇到这个问题有如下解决方案。
方案1:把新建的sh1改个名字,改成sh3.再闪回sh1.
方案2:假设原始表是sh4,误删除以后。新建立了sh4,还写入了数据。那么闪回时候兼带改名字,一气呵成。
SQL> create table sh4 (a int,b int);
表已创建。
SQL> insert into sh4 values (1,1);
已创建 1 行。
SQL> commit;
提交完成。
SQL> drop table sh4;
表已删除。
SQL> create table sh4 (a int,b int);
表已创建。
SQL> insert into sh4 values (2,2);
已创建 1 行。
SQL> commit;
提交完成。
SQL> flashback table sh4 to before drop rename to sh5;
闪回完成。
SQL> select * from sh4;
A B
---------- ----------
2 2
SQL> select * from sh5;
A B
---------- ----------
1 1
方案2也是最近才在实际中用过。