在使用闪回技术恢复被DROP的表时,需要注意,如果表是被创建在SYSTEM表空间上,则此类表一旦被DROP,将不可以使用Flashback Drop技术进行恢复。
1.验证创建在SYSTEM表空间的表不可以被闪回
1)在普通用户sec上进行测试
sys@ora10g> conn sec/sec
Connected.
2)在sec用户下创建表T,表T存放在SYSTEM表空间上
sec@ora10g> create table t (x int) tablespace SYSTEM;
Table created.
3)查看回收站中的数据
sec@ora10g> show recyclebin;
此时回收站中的数据为空。
4)对表T执行不带purge选项的DROP删除操作
sec@ora10g> drop table t;
Table dropped.
5)在此确认回收站中是否记录删除的数据
sec@ora10g> show recyclebin;
sec@ora10g>
此时回收站依然空空如也。
SYSTEM表空间上创建的表无法被闪回的结论得以验证。
2.澄清:并非SYS以及SYSTEM系统用户下所有表都不能被闪回
这里再次强调,只有那些创建在SYSTEM表空间上的表不可以被闪回。也就是说,如果表是属于SYS或SYSTEM用户,但是所存放的表空间非SYSTEM时,是可以被闪回的。验证如下。
1)之所以会存在这个误区是因为SYS和SYSTEM用户的默认表空间是SYSTEM表空间
sys@ora10g> select USERNAME,DEFAULT_TABLESPACE from dba_users where USERNAME in ('SYS','SYSTEM');
USERNAME DEFAULT_TABLESPACE
------------------------------ ------------------------------
SYS SYSTEM
SYSTEM SYSTEM
因此在SYS或SYSTEM用户下创建的表默认会存放到SYSTEM表空间(若没有使用tablespace选项进行指定)。
2)在SYS用户下创建表T,但表所属表空间非系统SYSTEM表空间
sys@ora10g> create table t (x int) tablespace TBS_SEC_D;
Table created.
sys@ora10g> col owner for a6
sys@ora10g> select owner,segment_name,tablespace_name from dba_segments where segment_name='T';
OWNER SEGMENT_NAME TABLESPACE_NAME
------ ------------------------------ ---------------------
SYS T TBS_SEC_D
sys@ora10g> show user;
USER is "SYS"
3)对表T执行不带purge选项的DROP删除操作
sys@ora10g> drop table t;
Table dropped.
4)确认回收站中是否存在被删除的对象
sys@ora10g> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
------------- ------------------------------ ------------ -------------------
T BIN$pBoDteMEBFzgQMKQt8BPJw==$0 TABLE 2011-06-01:20:40:50
被删除的T表已经在回收站中存在。
5)尝试对T表进行闪回
sys@ora10g> flashback table t to before drop;
Flashback complete.
T表闪回成功。
sys@ora10g> desc t;
Name Null? Type
-------- -------- -------------------
X NUMBER(38)
3.小结
SYSTEM表空间是一个神奇的地方,在这个神秘的国度存放的表将不支持闪回。
Good luck.
secooler
11.06.01
-- The End --