从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也是最近才在实际中用过。
