现在的位置: 首页 > 综合 > 正文

利用flashback query解决误删除表数据

2012年03月24日 ⁄ 综合 ⁄ 共 2238字 ⁄ 字号 评论关闭

【使用场景】:1、操作失误导致deleteupdate的数据已经提交。

2、对一个表做了改动,你想看看有哪些数据发生了变化。

3、误删除了functionproceduretrigger

【使用环境】:oracle 10g r1
oracle 10g r2 Oracle 11g r1
oracle 11g r2

【注意事项】:(1)基于undo
的表恢复,需要注意DDL
操作的影响。修改并提交过数据之后,对表做过DDL
操作,包括:drop/modify
, move
, drop
分区(如果有的话), truncate table/partition,这些操作会另undo
表空间中的撤销数据失效,对于执行过这些操作的表应用flashback query
会触发ORA-01466
错误。

另外一些表结构修改语句虽然并不会影响到undo
表空间中的撤销记录,但有可能因表结构修改导致undo
中重做记录无法应用的情况,比如对于增加了约束,而flashback query
查询出的undo
记录已经不符合新建的约束条件,这个时候直接恢复显然不可能成功,你要么暂时disable
约束,要么通过适当逻辑,对要恢复的数据进行处理之后,再执行恢复。

2)基于undo
的表恢复,flashback table
实际上做的也是dml
操作(会在被操作的表上加dml
),因此还需要注意triggers
对其的影响,默认情况下,flashback table to scn/timestamp
在执行时会自动disable
掉与其操作表相差的triggers,如果你希望在此期间trigger
能够继续发挥做用,可以在flashback table
后附加 ENABLE TRIGGERS
子句。
Flashback QueryFlashback Query,Flashback Version Query
Flashback Transaction Query
三种。

如果使用truncate
删除表数据或者drop user XXX cascade;这样的话貌似只能使用flashback
database(
数据库默认不开启)、imp/impdp(需要提前备份)、RMAN恢复(需要备份集)、LOGMINER
日志挖掘(需要开归档)。并且还会造成很多工作白做。

主要写一下上次罗丹同志提到的方法,也是最常用的:例如有一个A表数据删除,但我又想找回删除的数据。

语法:SELECT * FROM tablename AS OF TIMESTAMP
TO_TIMESTAMP('2013-01-11 11:10:17', 'YYYY-MM-DD HH24:MI:SS');

 

SQL>create table A (id number);

SQL> insert into a values (1);

 

1 row created.

 

SQL> insert into a values (2);

 

1 row created.

 

SQL> insert into a values (3);

 

1 row created.

 

SQL> insert into a values (4);

 

1 row created.

 

SQL> commit;

 

Commit complete.

 

SQL> select * from a;

 

      
ID

----------

      
 1

      
 2

      
 3

      
 4

模拟用户误操作,删除数据

 

SQL> delete from A;

 

已删除4行。

 

SQL> commit;

 

提交完成。

 

SQL> select * from A;

 

未选定行

 

查看删除之前的状态:假设当前距离删除数据已经有5
分钟左右的话:

 

SQL> select * from A as of timestamp sysdate-5/1440;

 

      
ID

----------

      
 1

      
 2

      
 3

      
 4

或者:

SQL>select * from A as of timestamp to_timestamp('2013-01-13 12:00:16','YYYY-MM-DD hh24:mi:ss');

 

ID

----------

      
 1

      
 2

      
 3

      
 4

Flashback Query恢复之前的数据:

 

SQL>Insert into A select * from A as of timestamp to_timestamp('2013-01-13 12:00:16','YYYY-MM-DD hh24:mi:ss');

已创建4行。

 

SQL> COMMIT;

 

提交完成。

 

SQL> select * from A;

 

ID

----------

      
 1

      
 2

      
 3

      
 4

如上述示例中所表示的,as of timestamp
的确非常易用.

到底flashback query
能查询多长时间的呢?

这要取决于undo_retention的值。--默认900秒,15分钟。

但是,并不是说保留15分钟。UNDO_RETENTION是指在有足够空间的情况下"最少保留多久"。关于这个大家可以测试下。

更详细的信息,请googlebaidu
,如果有兴趣可以看看官方文档。

本文参考官方文档:

Oracle® Database

Advanced Application Developer's Guide

11g
Release 2 (11.2)

E17125-05

 

Using Oracle Flashback Technology

Using Oracle Flashback Query (SELECT AS OF)

【上篇】
【下篇】

抱歉!评论已关闭.