利用閃回拯救我們的資料(三)

realkid4發表於2011-01-29

在上篇裡,我們說明了閃回表的功能和使用。在本篇中,我們先來看一些閃回表的特點。之後一起來分析閃回表的原理。

 

 

SYS使用者物件不能閃回

SYS使用者是Oracle系統中的超級使用者,肩負著執行資料庫啟動、關閉、備份等管理職責。在物件控制上,SYS使用者可以訪問所有物件和資料。所以,一般都建議不要直接使用SYS進行實際日常DBA工作。

 

在閃回這個問題上,SYS使用者是受到限制的。下面我們使用SYS使用者實驗閃回特性。

 

 

SQL> conn / as sysdba;

已連線。

SQL> show user;

USER 為 "SYS" //確定是以sys使用者登入的

SQL> create table t as select * from dba_objects;

 

表已建立。

 

SQL> select count(*) from t;

 

  COUNT(*)

----------

     50331

 

SQL> show parameter recyclebin; //當前開啟的是閃回模式

 

NAME                      TYPE        VALUE

------------------------- ----------- -----------

recyclebin                string      on

SQL> drop table t;

 

表已刪除。

 

SQL> show recyclebin; //沒有閃回記錄

SQL> select * from user_recyclebin;

 

未選定行

 

看來,當我們使用sys使用者進行預設表空間(sys使用者的預設表空間為system)資料表drop的時候,是不會被閃回的。Oracle內部也不支援這種操作。

 

那麼,這種特點是針對SYS的呢?還是針對system表空間的呢?我們繼續下面的實驗,建立一張資料表在users表空間

 

-- Create table

create table t

(

  id number(10) not null

)

tablespace USERS

  storage

  (

    initial 64K

    minextents 1

    maxextents unlimited

  );

 

//準備資料

SQL> insert into t  select object_id from dba_objects;

 

50331 rows inserted

 

SQL> commit;

 

Commit complete

 

//確認資料表所在的表空間

SQL> select table_name,tablespace_name from all_tables where wner='SYS' and table_name='T';

 

TABLE_NAME                     TABLESPACE_NAME

------------------------------ ------------------------------

T                              USERS

 

//刪除資料表

SQL> drop table t;

 

表已刪除。

 

//顯示回收站

SQL> show recyclebin;

ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME

---------------- ------------------------------ ------------ -------------------

T                BIN$kLlt43leRJGNWtQMB/yTaQ==$0 TABLE        2011-01-28:00:14:18

 

 

顯然,閃回機制對system表空間資料表是不進行閃回的。

 

結論:使用sys使用者的閃回要注意,當建立資料表是在system表空間下的時候,是不支援閃回特性的。

 

 

閃回表回收站——兩個檢視

 

使用方面,閃回特性還要關注兩個回收站檢視。all_recyclebin、dba_recyclebin。

 

all/user/dba三層結構,我們熟悉Oracle的朋友一定不會陌生。Oracle中大部分物件都提供了以這三個作為字首的命名檢視。三層的檢視表示的都是一種型別物件,都是對後設資料表的對映。

 

最低一個層次是user_檢視,表示當前使用者所屬的schema下的物件。其次是all_檢視是當前使用者所能訪問、具有訪問許可權的物件資訊。物件的owner可能不是當前使用者,但是因為具有訪問許可權,也是可能被訪問到。最高的是dba_檢視,通常只有DBA使用者才能訪問到該層面檢視,常用來作為全域性物件。

 

recyclebin系列檢視也是類似的作用。檢視中可以查詢到回收站中的物件資訊。

 

 

SQL> desc dba_recyclebin;

Name           Type         Nullable Default Comments                 

-------------- ------------ -------- ------- --------------------------------------------------------

OWNER          VARCHAR2(30)                  Name of the original owner of the object                

OBJECT_NAME    VARCHAR2(30)                  New name of the object   

ORIGINAL_NAME  VARCHAR2(32) Y                Original name of the object   OPERATION      VARCHAR2(9)  Y                Operation carried out on the object

TYPE           VARCHAR2(25) Y                Type of the object 

TS_NAME        VARCHAR2(30) Y        Tablespace Name to which object belongs

CREATETIME     VARCHAR2(19) Y            Timestamp for the creating of the object

DROPTIME       VARCHAR2(19) Y         Timestamp for the dropping of the object

DROPSCN        NUMBER       Y      SCN of the transaction which moved object to Recycle Bin

PARTITION_NAME VARCHAR2(32) Y                Partition Name which was dropped

CAN_UNDROP     VARCHAR2(3)  Y                User can undrop this object     

CAN_PURGE      VARCHAR2(3)  Y                User can purge this object     

RELATED        NUMBER                        Parent objects Obj#      

BASE_OBJECT    NUMBER                        Base objects Obj#        

PURGE_OBJECT   NUMBER                        Obj# for object which gets purged 

SPACE          NUMBER       Y                Number of blocks used by this object

 

 

 

注意其中幾個欄位:包括原物件名、現在物件名稱、刪除時間等。這些可以幫助我們瞭解到物件的回收機制。注意其中的canpurge和canundrop兩個標誌,表示當前這個回收站物件時候可以進行操作。

 

同時,我們注意到回收站檢視中是沒有all_檢視的。這其實也比較好理解:回收站是屬於物件所有者的回收站。建立回收站的目的是為了將刪除的物件可以閃回,將物件閃回的許可權,還是控制在物件原有所有者或者DBA使用者手中比較好。

 

 

在回收站空間管理上,也要關注purge命令的使用。我們是可以直接對recyclebin使用purge命令的。相對於上面的命令格式,這種方式其實更加簡單直接。

 

ü        purge user_recyclebin;

ü        purge dba_recyclebin;

 

SQL> select * from dba_recyclebin;

 

OBJECT_NAME                    ORIGINAL_NAME                   

------------------------------ ----------------

BIN$kLlt43leRJGNWtQMB/yTaQ==$0 T                               

 

(結果資料段有省略)

SQL> purge user_recyclebin;

 

Done

 

SQL> purge dba_recyclebin;

 

Done

 

SQL> select object_name, original_name from dba_recyclebin;

 

OBJECT_NAME     ORIGINAL_NAME

--------------- --------------------------------

//物件被清理

 

 

 

結論:使用dba_recyclebin和user_recyclebin可以比較容易的看到整個資料庫和當前使用者物件的回收站。

 

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

相關文章