FLASHBACK TABLE

1   flashback table语法

1alter table test_flash enable row movement;--使用flashback table要先开启row movement,负责会抛ORA-08189错误

2flashback table test_flash to scn 313101;--闪回表到313101系统变更号

--闪回到某scn

3flashback table tab_test to timestamp to_timestamp('2010-06-30 23:02:37', 'yyyy-mm-dd hh24:mi:ss') enable triggers;

--闪回到某个时间点,enable triggers为可选项

flashback table test_flash1 to timestamp sysdate-3/1440; --闪回表到三分钟前

4flashback table a,b ,c to scn 1103864;

Flashback table 命令支持同时操作多个表,表名中间以逗号分隔即可,如果你执行一条flashback table命令时同时指定了多个表,要记住单个flashback table 是在同一个事务中,因此这些表的恢复操作要么都成功,要么都失败

 

--可以通过对Flashback TableSQL Trace来进一步观察。通过Trace,我们不难发现,Flashback Table实际是通过Flashback Query将表中数据进行了一次删除、插入操作,因此ROWID会发生变化。

2   flashback table使用注意事项

1sys用户所有的表不支持flashback table功能

SQL> flashback table test_flash to scn 313615;

flashback table test_flash to scn 313615

*

ERROR at line 1:

ORA-08185: Flashback not supported for user SYS

--注意sys用户所有的表不支持flashback table功能(同system表空间对象不支持flashback drop区分开)

2基于undo 的表恢复,需要注意DDL 操作的影响修改并提交过数据之后,对表做过DDL 操作,包括:drop/modify , move , drop 分区(如果有的话), truncate table/partition,这些操作会另undo 表空间中的撤销数据失效,对于执行过这些操作的表应用flashback query 会触发ORA-01466 错误。另外一些表结构修改语句虽然并不会影响到undo 表空间中的撤销记录,但有可能因表结构修改导致undo 中重做记录无法应用的情况,比如对于增加了约束,而flashback query 查询出的undo 记录已经不符合新建的约束条件,这个时候直接恢复显然不可能成功,你要么暂时disable 约束,要么通过适当逻辑,对要恢复的数据进行处理之后,再执行恢复。另外,flashback query v$tables,x$tables 等动态性能视图无效,不过对于dba_*,all_*,user_*等数据字典是有效的。同时该特性也完全支持访问远端数据库,比如select * from tbl@dblink as of scn 360;的形式。


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

SQL> flashback table test_flash to scn 315760 enable triggers;

Flashback complete.

--注意加上enable triggers选项是让触发器在flashback table过程中起作用,并不能让触发器触发的表也闪回到之前状态,所以如果一个表上建有触发器,那么我们在flashback table该表时同时要考虑是否需要把触发的表也恢复的之前的状态()

alter table test_flash enable row movement;

flashback table test_flash to scn 315760;

--flashback table有触发器的表时不加enable triggers

alter table test_flashbak enable row movement

flashback table test_flashbak to scn 315760;

--同时把触发器影响的表也恢复到相同的scn

 

4flashback table 会对闪回的表加排他锁

SQL> select l.object_id,d.object_name,l.session_id,l.locked_mode from v$locked_object l,dba_objects d where d.object_id=l.object_id;

OBJECT_ID OBJECT_NAM SESSION_ID LOCKED_MODE

---------- ---------- ---------- -----------

13952 TEST_FLASH306