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 RELATIVE_FNO,bytes,blocks,extents from dba_segments where segment_name='GJJ_TEST'
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 RELATIVE_FNO,bytes,blocks,extents from dba_segments where segment_name='BIN$HLWT85NWSGmsv4pq+aJFUw==$0'
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。
到了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 RELATIVE_FNO,bytes,blocks,extents from dba_segments where segment_name='GJJ_TEST'
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 RELATIVE_FNO,bytes,blocks,extents from dba_segments where segment_name='BIN$HLWT85NWSGmsv4pq+aJFUw==$0'
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。
有一些方法控制回收站,比如可以用对象的原有名字从回收站中清除指定对象,或者用对象被删除后系统自动重命名的名字来指定清除它:
PURGE TABLE GJJ_TEST,PURGE TABLE "BIN$HLWT85NWSGmsv4pq+aJFUw==$0"
清除表时,同时也会清除依赖这张表的约束,如索引。可以指定只清除表相应的约束,如:
PURGE INDEX IDX_TEST
此外,还可以将整个表空间的回收站内容全部清除:PURGE TABLESPACE Users
也可以清除某个表空间上的回收站中某个用户的对象:PURGE TABLESPACE Users USER GJJ
当用某个普通用户登录时,只会清除它自己的对象:PURGE RECYCLEBIN
当以DBA身份登录时,可以清除所有表空间上回收站 :PURGE DBA_RECYCLEBIN
还有一个,FLASHBACK TABLE还可以把表恢复到某个时间点(SCN)
如果未启用行移动功能, 不能闪回表,
SQL>alter table gjj_test enable row movement
SQL>FLASHBACK TABLE GJJ_Test TO SCN 2299919
可以发现数据以恢复了。
本文转自 anranran 51CTO博客,原文链接:http://blog.51cto.com/guojuanjun/283501