Oracle 10 Recycle Bin回收站(轉)

G8bao7發表於2018-01-26


這個功能從10g開始有了。

(1)什麼是Recycle Bin
實際上,Recycle Bin只是一個儲存被drop的物件的一個資料字典表。所以,可以透過如下語句查詢回收站中的資訊:select * from recyclebin

除非擁有sysdba許可權,每個使用者只能看到屬於自己的物件。所以,對於使用者來說,好像每個人都擁有自己的回收站。即使使用者有刪除其它schema物件的許可權,也只能在recyclebin中看到屬於自己的物件。[@more@]

做個小試驗:
SQL> conn ning/ning
已連線。
SQL> drop table test;

表已刪除。

SQL> drop table test.test;

表已刪除。

SQL> select object_name,original_name from recyclebin;

OBJECT_NAME ORIGINAL_NAME
------------------------------ --------------------------------
BIN$xJlIkIFVR/yau1Qb8ocxxQ==$0 TEST

SQL> con test/test
已連線。

SQL> select object_name,original_name from recyclebin;

OBJECT_NAME ORIGINAL_NAME
------------------------------ --------------------------------
BIN$1PKEiRExRN2g3tqEEWLfyw==$0 TEST

以下幾種drop不會將相關物件放進RecycleBin:

以下幾種drop不會將相關物件放進RecycleBin:
drop tablespace:會將RecycleBin中所有屬於該tablespace的物件清除
drop user:會將RecycleBin中所有屬於該使用者的物件清除
drop cluster:會將RecycleBin中所有屬於該cluster的成員物件清除
drop type:會將RecycleBin中所有依賴該type的物件清除
RecycleBin中的物件會被系統自動按照規則重新命名,這是為了防止命名衝突。命名格式為:BIN$unique_id$version

其中unique_id是26個字元的物件唯一標識,version則是物件在資料庫中的版本號。

SQL> create table t(id int);

表已建立。

SQL> drop table t;

表已刪除。

SQL> select object_name,original_name from recyclebin;

OBJECT_NAME ORIGINAL_NAME
------------------------------ --------------------------------
BIN$+7J5MgT2RbCX+tka+zjpgA==$0 T

SQL> create table t(id int);

表已建立。

SQL> drop table t;

表已刪除。

SQL> select object_name,original_name from recyclebin;

OBJECT_NAME ORIGINAL_NAME
------------------------------ --------------------------------
BIN$+7J5MgT2RbCX+tka+zjpgA==$0 T
BIN$pc+kkUM7QjuQeCDGtwlzgQ==$0 T

可以看到,刪除table t後,重建一個名為t的table,再次刪除,其unique_id是不一樣的。

這時,做一個還原看看:

SQL> select object_name,original_name from recyclebin;

OBJECT_NAME ORIGINAL_NAME
------------------------------ --------------------------------
BIN$+7J5MgT2RbCX+tka+zjpgA==$0 T

這裡,Oracle選擇了最後一次刪除的T表還原。

再次刪除:
SQL> drop table t;

表已刪除。

SQL> select object_name,original_name from recyclebin;

OBJECT_NAME ORIGINAL_NAME
------------------------------ --------------------------------
BIN$4bNgZiMGTA63iwA5xflh5A==$0 T
BIN$+7J5MgT2RbCX+tka+zjpgA==$0 T

可以看到unique_id又變了。所以,透過這種命名方式,避免了對於刪除table後又重建了同名table的情況可能造成的命名衝突。

2.如何啟用/禁用RecycleBin

透過設定初始化引數recyclebin,可以控制是否啟用回收站功能,預設是開啟的。
SQL> alter system set recyclebin=off;

系統已更改。

SQL> alter system set recyclebin=on;

系統已更改。

SQL> alter session set recyclebin=off;

會話已更改。

SQL> alter session set recyclebin=on;

會話已更改。

3.如何檢視RecycleBin中的資訊

前面已經提到,使用者可以透過查詢recyclebin來檢視屬於自己的被drop的物件。
SQL> select object_name,object_type from dba_objects where object_name='RECYCLEB
IN';

OBJECT_NAME OBJECT_TYPE
------------------------------ -------------------
RECYCLEBIN SYNONYM

SQL> select owner,synonym_name,table_owner,table_name from dba_synonyms where sy
nonym_name='RECYCLEBIN';

OWNER SYNONYM_NAME TAB TABLE_NAME
---------- -------------------- --- --------------------
PUBLIC RECYCLEBIN SYS USER_RECYCLEBIN

可以發現,實際上recyclebin是user_recyclebin的一個公共同義詞。還可以透過dba_recyclebin檢視系統中所有被drop的物件,但這裡沒有all_recyclebin檢視。

另外,Sqlplus也提供了一個專門的命令:
SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------

TEST BIN$xJlIkIFVR/yau1Qb8ocxxQ==$0 TABLE 2006-12-13:22:00:33

但該命令只能看到被drop的table,該table對應的index等只能透過查詢獲取。
SQL> create table t(id int);

表已建立。

SQL> create index ix_t on t(id);

索引已建立。

SQL> alter table t add constraint con_t_pk primary key(id) using index ix_t;

表已更改。

SQL> drop table t;

表已刪除。


SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------

T BIN$w0Os4BFTSE+N81RO1pUHaw==$0 TABLE 2006-12-13:22:45:58

SQL> select object_name,original_name,type from recyclebin;

OBJECT_NAME ORIGINAL_NAME TYPE
------------------------------ -------------------------------- ----------
BIN$dw0vOefrQPC5AAaFn7rkPg==$0 IX_T INDEX
BIN$w0Os4BFTSE+N81RO1pUHaw==$0 T TABLE

4.如何清除RecycleBin中的物件

回收站中的東西多了,自然要清除。Oracle10g增加了一個新的關鍵字purge來執行清除recyclebin的功能。

purge table table_name可以清除指定的table,這裡的table_name既可以是table原來的名字,也可以是回收站中按規則自動命名的名字。
SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------

T BIN$+7J5MgT2RbCX+tka+zjpgA==$0 TABLE 2006-12-13:22:11:49

TEST BIN$RwhOW+KvTSmOznDipO+BOw==$0 TABLE 2006-12-13:22:30:38

SQL> purge table test;

表已清除。

SQL> purge table BIN$+7J5MgT2RbCX+tka+zjpgA==$0;
purge table BIN$+7J5MgT2RbCX+tka+zjpgA==$0
*
第 1 行出現錯誤:
ORA-00933: SQL 命令未正確結束

SQL> purge table "BIN$+7J5MgT2RbCX+tka+zjpgA==$0";

表已清除。

Purge tablespace tablespace_name可以清除RecycleBin屬於指定tablespace的所有物件。
SQL> purge tablespace users;

表空間已清除。

Purge tablespace tablespace_name user user_name則可以清除Recycle中屬於指定tablespace和指定user的所有物件。
SQL> purge tablespace users user ning;

表空間已清除。

Purge recyclebin可以清除執行該命令的使用者所能看到的所有recyclebin物件。也就是普通使用者能清除屬於自己的物件,而sysdba使用者則能清除所有recyclebin中的物件。
SQL> purge recyclebin;

回收站已清空。

另外,purge index可以清除index物件。
SQL> select object_name,original_name,type from recyclebin;

OBJECT_NAME ORIGINAL_NAME TYPE
------------------------------ -------------------------------- ----------
BIN$dw0vOefrQPC5AAaFn7rkPg==$0 IX_T INDEX
BIN$w0Os4BFTSE+N81RO1pUHaw==$0 T TABLE

SQL> purge index ix_t;
purge index ix_t
*
第 1 行出現錯誤:
ORA-00604: 遞迴 SQL 級別 1 出現錯誤
ORA-02429: 無法刪除用於強制唯一/主鍵的索引

這裡由於ix_t是table主鍵的索引,所以無法單獨清除。

SQL> purge recyclebin;

回收站已清空。

SQL> create table t1(id int);

表已建立。

SQL> create index ix_t1 on t1(id);

索引已建立。

SQL> drop table t1;

表已刪除。

SQL> select object_name,original_name,type from recyclebin;

OBJECT_NAME ORIGINAL_NAME TYPE
------------------------------ -------------------------------- ----------
BIN$s6zn2IT+Ree2+slP2dpa0A==$0 IX_T1 INDEX
BIN$j2O8O52CT3aoakF4LlAGfg==$0 T1 TABLE

SQL> purge index ix_t1;

索引已清除。

5.如何還原RecycleBin中的物件

前面的試驗中已經使用Flashback table來還原過被刪除的table。

SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------

TEST BIN$xJlIkIFVR/yau1Qb8ocxxQ==$0 TABLE 2006-12-13:22:00:33

SQL> flashback table test to before drop rename to test;

閃回完成。

SQL> desc test
名稱 是否為空? 型別
----------------------------------------- -------- ----------------------------

ID NUMBER(38)

如果多次刪除同名的table,則使用上面的語句還原的是最後一個被刪除的test表,這裡也可以使用RecycleBin給table的名字來做還原。
SQL> flashback table "BIN$GoZUqZ6GS222JZdcCtFlHQ==$0" to before drop rename to test;

閃回完成。

================================================================================

閃回丟棄(Flashback Drop)

閃回丟棄是將被丟棄的資料庫物件及其相依物件的複製儲存在回收站中,以便在必要時能夠及時恢復這些物件。在回收站被清空以前,被丟棄的物件並沒有從資料庫中刪除。這就使資料庫能夠恢復被意外或者誤操作而刪除的表。

為了更好地理解閃回丟棄,需要理解回收站的工作細節,以及丟棄物件在回收站中的儲存、查詢與清除等,將在以下的小節中介紹。

17.5.1 回收站概念

回收站(Recycle Bin)是所有丟棄表及其相依物件的邏輯儲存容器。當一個表被丟棄時(DROP),回收站會將該表及其相依物件儲存在回收站中。儲存在回收站中的表的相依物件包括索引、約束、觸發器、巢狀表、大的二進位制物件(LOB)段和LOB索引段。

Oracle回收站將使用者所進行的DROP語句的操作記錄在一個系統表裡,即將被刪除的物件寫到一個資料字典表中,確定是不再需要的被刪除物件時,可以使用PURGE命令對回收站空間進行清除。

為了避免被刪除表與同類物件名稱的重複,被刪除表(及相依物件)放到回收站中後,Oracle系統對被刪除的物件名進行了轉換。被刪除物件(如表)的名字轉換格式如下:

BIN$globalUID$version

l globalUID是一個全域性唯一的、24個字元長的標識物件,它是Oracle內部使用的標識,對於使用者來說沒有任何實際意義,因為這個標識與物件未刪除前的名稱沒有關係。

l $version 是Oracle資料庫分配的版本號。

17.5.2 使用回收站

如果要對DROP過的表進行恢復操作,可以使用以下語句:

SQL>FLASHBACK TABLE table_name TO BEFORE DROP

為了幫助讀者理解回收站在使用中的操作過程,下面給出較詳細的回收站操作步驟。

示例:本例給出資料準備、刪除表、查詢回收站資訊、恢復及查詢恢復後的情況。

(1)連線Oracle

[oracle@localhost ~]$ sqlplus scott/tiger

SQL*Plus: Release 11.1.0.6.0 - Production on Sat Oct 20 16:32:00 2007

Copyright (c) 1982, 2007, Oracle. All rights reserved.

Connected to:

Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> set line 120;

SQL> set pagesize 50;

SQL> show user;

USER is "SCOTT"

SQL>

(2)準備資料

SQL> create table my_emp as select * from emp;

Table created.

SQL> select count(*) from my_emp;

COUNT(*)

----------

14

SQL>

(3)刪除表結構

SQL> select * from tab;

TNAME TABTYPE CLUSTERID

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

BONUS TABLE

DEPT TABLE

EMP TABLE

EMP2 TABLE

MY_EMP TABLE

SALGRADE TABLE

SYS_TEMP_FBT TABLE

7 rows selected.

SQL> drop table my_emp;

Table dropped.

SQL>

(4)刪除(DROP)表後的資料字典

SQL> select * from tab;

TNAME TABTYPE CLUSTERID

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

BIN$POiMOEfPgU3gQAB/AQASlg==$0 TABLE

BONUS TABLE

DEPT TABLE

EMP TABLE

EMP2 TABLE

SALGRADE TABLE

SYS_TEMP_FBT TABLE

7 rows selected.

需要說明的是,當MY_EMP表被刪除以後,在資料庫回收站裡變成了BIN$POiMOEfPgU3gQAB/ AQASlg==$0,version是0。

(5)檢視user_recyclebin回收站,可以看到刪除的表對應的記錄:

SQL> col object_name for a30;

SQL> col original_name for a20;

SQL> select object_name,original_name from user_recyclebin;

OBJECT_NAME ORIGINAL_NAME

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

BIN$POiMOEfPgU3gQAB/AQASlg==$0 MY_EMP

SQL>

(6)利用user_recyclebin中的記錄,使用FLASHBACK從回收站恢復表MY_EMP:

SQL> flashback table my_emp to before drop;

Flashback complete.

SQL> select count(*) from my_emp;

COUNT(*)

----------

14

SQL>

以上是恢復完成後的查詢結果。

17.5.3 回收站與空間利用

回收站是丟棄物件的邏輯儲存容器,它以表空間中現有的已經分配的空間為基礎,這意味著系統並沒有給回收站預留空間。這使回收站空間依賴於現有表空間中的可用空間(也就是說丟棄表佔據的空間仍然需要計入表空間配額)。因此並不能總是保證丟棄物件在回收站中的最小時間。

如果不對回收站進行清除操作,丟棄物件會一直儲存在回收站內,一直到丟棄物件所屬的表空間無法再分配新的儲存區域,這種狀態稱之為空間壓力。有時,使用者的表空間限額也會導致空間壓力狀態的出現,即使表空間中仍然存在自由空間。

當空間壓力出現時,Oracle會覆蓋些回收站物件從而自動回收表空間。Oracle根據先 進先出的原則來選擇丟棄物件進行刪除,所以最先被丟棄的物件也最先被清除。而物件的清除僅僅是為了解決產生的空間壓力問題,所以會盡可能清除少的物件來滿 足空間壓力的要求。這樣處理,既最大限度地保證了物件在回收站中的可用時間,又減少了Oracle在事物處理時的效能影響。

DBA需要關注回收站的空間利用情況,掌握清除回收站物件從而釋放空間的辦法,這可用PURGE命令來完成。PURGE命令可從回收站中刪除表或索引,並釋放有關表和索引所佔用的空間;用PURGE命令也可清除整個回收站或清除被刪除的表空間的所有部分。

值得一提的是,當用PURGE命令清除掉被刪除的物件後,該物件確實是被完全清除掉而不能再重建了。

要清除回收站中的物件,釋放空間,有以下幾種方式。

(1)使用PURGE TABLE original_table_name。

這裡的original_table_name表示表在drop以前的名稱(源名稱),使用該操作可以從回收站中永久地刪除物件並釋放空間。

(2)使用PURGE TABLE recyclebin_object_name。

這裡的recyclebin_object_name表示回收站中的物件名稱,使用該操作可以從回收站中永久地刪除物件並釋放空間。

(3)使用PURGE TABLESPACE tablespace_name從回收站清除一個特定表空間的所有物件。

該命令從指定的表空間中清除所有的丟棄物件及相依物件。因為相依物件(比如LOB、巢狀表、索引和分割槽等)未必與基表儲存在同一個表空間,該命令會將相依物件從其所在的表空間中進行清除。

(4)使用PURGE TABLESPACE tablespace_name USER user_name,會從回收站中清除屬於某個特定使用者的所有丟棄物件(當然也包括基表的相依物件)。

(5)使用命令DROP USER user_name CASCADE直接刪除指定使用者及其所屬的全部物件。

也就是說DROP USER命令會繞過回收站直接進行刪除。同時,如果回收站中也有該使用者的所屬物件,則也會從回收站中清除掉。

(6)使用PURGE RECYCLEBIN 命令可以清除使用者自己的回收站。

該命令從使用者回收站中清除所有的物件並釋放與這些物件關聯的空間。

(7)PURGE DBA_RECYCLEBIN從所有使用者的回收站清除所有物件。

該命令能高效地完全清空回收站,當然執行該命令必須具有SYSDBA系統管理許可權才可以。

示例:查詢當前使用者回收站中的內容,再用PURGE清除。

SQL> show user;

USER is "SCOTT"

SQL> create table orcltest as select * from emp;

Table created.

SQL> select * from tab;

TNAME TABTYPE CLUSTERID

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

BONUS TABLE

DEPT TABLE

EMP TABLE

EMP2 TABLE

MY_EMP TABLE

ORCLTEST TABLE

SALGRADE TABLE

SYS_TEMP_FBT TABLE

8 rows selected.

SQL> drop table orcltest;

Table dropped.

SQL> select object_name,original_name from user_recyclebin;

OBJECT_NAME ORIGINAL_NAME

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

BIN$POiMOEfQgU3gQAB/AQASlg==$0 ORCLTEST

SQL>

SQL> show user;

USER is "SCOTT"

SQL> select object_name,original_name from user_recyclebin;

OBJECT_NAME ORIGINAL_NAME

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

BIN$POiMOEfQgU3gQAB/AQASlg==$0 ORCLTEST

SQL> purge table orcltest;

Table purged.

SQL> select object_name,original_name from user_recyclebin;

no rows selected

FLASHBACK閃回表

今天誤刪除表裡面的資料,透過FLASHBACK閃回,

flashback table mmdb.column_class_def_t to timestamp to_timestamp('2009-03-24 14:40:00','yyyy-mm-dd hh24:mi:ss');

出現因為未啟用行移動功能,不能閃回表。

執行alter table mmdb.column_class_def_t enable row movement;然後再執行FLASHBACK,OK

轉自:http://hi.baidu.com/randie/blog/item/dc6c7118b999ab4943a9adc1.html

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

相關文章