欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

闪回冲突怎么办?

最编程 2024-06-26 13:57:09
...

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




推荐阅读