Oracle10g的recyclebin

oracle_ace發表於2007-12-29

做了個實驗,發現建立在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> conn hujinpei/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> conn alan/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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12361284/viewspace-61766/,如需轉載,請註明出處,否則將追究法律責任。

相關文章