xiahe999 发表于 2018-9-22 11:29:40

Oracle闪回表(笔记)

Flashback是ORACLE9i开始新特性,但9I只支持FlashQuery,即根据回滚段读取表某个时间点的数据。  到了10G,Oracle通过Recyle bin(回改站)与FlashArea(闪回区)实现快速恢复删除表((Flashback Table)
  和数据库时间点恢复((Flashback Database)(不需要全备份哦)。本文只记录了Flashback Table方法与特性。
  Oracle10g的Drop Table并不是直正的删除,而是更名。
  SQL>create table gjj_test(id number,name varchar2(64));
  SQL>create index gjj_test_idx on gjj_test(id);
  SQL>begin for i in 1..1000 loop insert into gjj_test values(i,'gjj');end loop;end;

  SQL> select>  2/
  RELATIVE_FNO      BYTES   BLOCKS    EXTENTS
  ------------ ---------- ---------- ----------
  4      65536          8          1
  SQL>drop table gjj_test
  SQL> select * from recyclebin
  2/
  OBJECT_NAME                  ORIGINAL_NAME
  ------------------------------ ---------------
  BIN$HLWT85NWSGmsv4pq+aJFUw==$0 GJJ_TEST

  SQL> select>  2/
  RELATIVE_FNO      BYTES   BLOCKS    EXTENTS
  ------------ ---------- ---------- ----------
  4      65536          8          1
  可以看到Drop Table并不是直正的删除,而是更名为BIN$HLWT85NWSGmsv4pq+aJFUw==$0,存储空间也没有发生变化。
  依赖于原表的存储过程都失效了,而建在表上的索引和触发器也会被重新命名。
  SQL>select INDEX_NAME from user_indexes where table_name='GJJ_TEST';
  INDEX_NAME
  --------------
  BIN$wgFf1rfqTHqFiyLpP1+Fxw==$0
  SQL>flashback table gjj_test to before drop;
  可以发现gjj_test已恢复正常,但是索引和触发器的名字并没有被改过来,只能通过alert index ..rename更改。
  但位图索引不会放到recylebin中,所以无法恢复。
  如果想DROP TABLE比较彻底,可以用drop table gjj_test purge。

页: [1]
查看完整版本: Oracle闪回表(笔记)