test19

如何恢复删除并且commit后的数据

1、现象、问题描述

经常会发生误删除数据,并且commit了。恍然醒悟!
但如何恢复呢?Oracle 9以前的版本如果在你删除之前没有对数据库完整备份的话,想恢复删除的数据比登天还难。
Oracle9 以后提供了数据库闪回功能,可以将数据库恢复到之前的某个合适的时间点。
而且提供了flashback query 功能,可以查询某个表在某个时间点的状态,即使这个表中的数据已经删除,并且commit了。
这就是用flashback恢复误删除并且commit后数据的原理。
测试如下场景:
SQL> create table t as select OBJECT_ID,object_name from dba_objects where rownum < 5;
 
Table created.
 
Elapsed: 00:00:00.42
SQL> select object_id,substr(object_name,1,15) from t;
 
 OBJECT_ID SUBSTR(OBJECT_N
---------- ---------------
        20 ICOL$
        44 I_USER1
        28 CON$
        15 UNDO$
 
Elapsed: 00:00:00.00
现在将其全部删除,并且commit:
SQL> delete from t;
 
4 rows deleted.
 
Elapsed: 00:00:00.00
SQL> commit;
 
Commit complete.
 
Elapsed: 00:00:00.01
SQL> select * from t;
 
no rows selected
 
Elapsed: 00:00:00.00

现在用flashback操作将其恢复,方法如下:
SQL> insert into t select * from t as of timestamp (systimestamp - 2/24/60);
 
4 rows created.  
SQL> select object_id,substr(object_name,1,15) from t;
 
 OBJECT_ID SUBSTR(OBJECT_N
---------- ---------------
        20 ICOL$
        44 I_USER1
        28 CON$
        15 UNDO$
 
Elapsed: 00:00:00.00

但是,有个问题是:flashback利用的是回滚段机制,将脏(已经删除)数据从回滚段中重新读出。
而回滚段是可重复利用的,所以当经过了很多事务以后,可能存放需要的脏数据的回滚段被重复利用,这样flashback对此就不再奏效了。

你可能感兴趣的:(oracle,sql)