做了个实验,发现建立在system上的对象是无法真正入recyclebin的。所以一般来讲sysdba的用户所drop的table是无法用flashback table t to before drop命令恢复的。
下面是实验:
首先以sysdba建立两个用户并赋予相应的权限
C:\Documents and Settings\Administrator>sqlplus /nolog
SQL*Plus: Release 10.2.0.3.0 - Production on 星期六 12月 29 19:26:45 2007
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
SQL> conn / as sysdba;
已连接。
SQL> create user hujinpei identified by passw0rd default tablespace users;
用户已创建。
SQL> create user alan identified by passw0rd default tablespace system;
用户已创建。
SQL> grant connect,resource,dba to hujinpei;
授权成功。
SQL> grant connect,resource,dba to alan;
授权成功。
以hujinpei用户登陆另外一个session
C:\Documents and Settings\Administrator>sqlplus /nolog
SQL*Plus: Release 10.2.0.3.0 - Production on 星期六 12月 29 19:29:55 2007
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
SQL> connhujinpei/passw0rd@irmdb
已连接。
SQL> create table t ( id int);
表已创建。
SQL> select object_name,original_name from recyclebin;
未选定行
SQL> drop table t;
表已删除。
SQL> select object_name,original_name from recyclebin;
OBJECT_NAME ORIGINAL_NAME
------------------------------ --------------------------------
BIN$Phso2StdTrq+wh642whvUA==$0 T
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
T BIN$Phso2StdTrq+wh642whvUA==$0 TABLE 2007-12-29:19:30:24
SQL> desc t;
ERROR:
ORA-04043: 对象 t 不存在
SQL> flashback table t to before drop;
闪回完成。
SQL> desc t;
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
ID NUMBER(38)
我们可以看到表在drop的时候进入了recyclebin,并且可以恢复了。
那如果我再以alan用户登陆新的session做同样的试验。
C:\Documents and Settings\Administrator>sqlplus /nolog
SQL*Plus: Release 10.2.0.3.0 - Production on 星期六 12月 29 19:34:07 2007
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
SQL> connalan/passw0rd@irmdb
已连接。
SQL> create table t ( id int );
表已创建。
SQL> select object_name,original_name from recyclebin;
未选定行
SQL> drop table t;
表已删除。
SQL> select object_name,original_name from recyclebin;
未选定行
SQL> flashback table t to before drop;
flashback table t to before drop
*
第 1 行出现错误:
ORA-38305: 对象不在回收站中
原因是alan用户创建的对象都在system表空间中。因此无法回收。
针对recyclebin的维护
比如
purge table table_name
purge recyclebin
等等有很多。
另外通过查询
SQL> select object_name,object_type from dba_objects
2 where object_name='RECYCLEBIN';
OBJECT_NAME
----------------------------------------------------------
OBJECT_TYPE
-------------------
RECYCLEBIN
SYNONYM
知道recyclebin是个同意词,那么他的源是什么呢?继续查询
SQL> select synonym_name,table_name from dba_synonyms where synonym_name='RECYCLEBIN';
SYNONYM_NAME TABLE_NAME
------------------------------ ------------------------------
RECYCLEBIN USER_RECYCLEBIN
这回我们就知道了,user_recyclebin就是recyclebin公用同意词的源。
后面的信息只是留用观察,供参考:
SQL> select synonym_name,table_name from dba_synonyms where synonym_name='USER_RECYCLEBIN';
SYNONYM_NAME TABLE_NAME
------------------------------ ------------------------------
USER_RECYCLEBIN USER_RECYCLEBIN
SQL> select synonym_name,table_name from dba_synonyms where synonym_name='USER_TABLES';
SYNONYM_NAME TABLE_NAME
------------------------------ ------------------------------
USER_TABLES USER_TABLES
SQL> select synonym_name,table_name from dba_synonyms where synonym_name='V$SESSION';
SYNONYM_NAME TABLE_NAME
------------------------------ ------------------------------
V$SESSION V_$SESSION