利用flashback query解决误删除表数据
【使用场景】:1、操作失误导致delete、update的数据已经提交。 2、对一个表做了改动,你想看看有哪些数据发生了变化。 3、误删除了function,procedure,trigger等 【使用环境】: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 子句。 如果使用truncate 删除表数据或者drop user XXX cascade;这样的话貌似只能使用flashback database(数据库默认不开启)、imp/impdp(需要提前备份)、RMAN恢复(需要备份集)、LOGMINER 日志挖掘(需要开归档)。并且还会造成很多工作白做。 主要写一下上次罗丹同志提到的方法,也是最常用的:例如有一个A表数据删除,但我又想找回删除的数据。 语法:SELECT * FROM tablename AS OF TIMESTAMP ? 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是指在有足够空间的情况下"最少保留多久"。关于这个大家可以测试下。 更详细的信息,请google、baidu ,如果有兴趣可以看看官方文档。 本文参考官方文档: 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) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |