溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Oracle 10 Recycle Bin回收站(轉(zhuǎn))

發(fā)布時間:2020-08-11 19:18:54 來源:ITPUB博客 閱讀:148 作者:G8bao7 欄目:關系型數(shù)據(jù)庫


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

(1)什么是Recycle Bin
實際上,Recycle Bin只是一個保存被drop的對象的一個數(shù)據(jù)字典表。所以,可以通過如下語句查詢回收站中的信息: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中的對象會被系統(tǒng)自動按照規(guī)則重命名,這是為了防止命名沖突。命名格式為:BIN$unique_id$version

其中unique_id是26個字符的對象唯一標識,version則是對象在數(shù)據(jù)庫中的版本號。

SQL> create table t(id int);

表已創(chuàng)建。

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);

表已創(chuàng)建。

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$4bNgZiMGTA63iwA5xflh6A==$0 T
BIN$+7J5MgT2RbCX+tka+zjpgA==$0 T

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

2.如何啟用/禁用RecycleBin

通過設置初始化參數(shù)recyclebin,可以控制是否啟用回收站功能,默認是開啟的。
SQL> alter system set recyclebin=off;

系統(tǒng)已更改。

SQL> alter system set recyclebin=on;

系統(tǒng)已更改。

SQL> alter session set recyclebin=off;

會話已更改。

SQL> alter session set recyclebin=on;

會話已更改。

3.如何查看RecycleBin中的信息

前面已經(jīng)提到,用戶可以通過查詢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

可以發(fā)現(xiàn),實際上recyclebin是user_recyclebin的一個公共同義詞。還可以通過dba_recyclebin查看系統(tǒng)中所有被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);

表已創(chuàng)建。

SQL> create index ix_t on t(id);

索引已創(chuàng)建。

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來執(zhí)行清除recyclebin的功能。

purge table table_name可以清除指定的table,這里的table_name既可以是table原來的名字,也可以是回收站中按規(guī)則自動命名的名字。
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 行出現(xiàn)錯誤:
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可以清除執(zhí)行該命令的用戶所能看到的所有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 行出現(xiàn)錯誤:
ORA-00604: 遞歸 SQL 級別 1 出現(xiàn)錯誤
ORA-02429: 無法刪除用于強制唯一/主鍵的索引

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

SQL> purge recyclebin;

回收站已清空。

SQL> create table t1(id int);

表已創(chuàng)建。

SQL> create index ix_t1 on t1(id);

索引已創(chuàng)建。

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中的對象

前面的試驗中已經(jīng)使用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)

閃回丟棄是將被丟棄的數(shù)據(jù)庫對象及其相依對象的復制保存在回收站中,以便在必要時能夠及時恢復這些對象。在回收站被清空以前,被丟棄的對象并沒有從數(shù)據(jù)庫中刪除。這就使數(shù)據(jù)庫能夠恢復被意外或者誤操作而刪除的表。

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

17.5.1 回收站概念

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

Oracle回收站將用戶所進行的DROP語句的操作記錄在一個系統(tǒng)表里,即將被刪除的對象寫到一個數(shù)據(jù)字典表中,確定是不再需要的被刪除對象時,可以使用PURGE命令對回收站空間進行清除。

為了避免被刪除表與同類對象名稱的重復,被刪除表(及相依對象)放到回收站中后,Oracle系統(tǒng)對被刪除的對象名進行了轉(zhuǎn)換。被刪除對象(如表)的名字轉(zhuǎn)換格式如下:

BIN$globalUID$version

l globalUID是一個全局唯一的、24個字符長的標識對象,它是Oracle內(nèi)部使用的標識,對于用戶來說沒有任何實際意義,因為這個標識與對象未刪除前的名稱沒有關系。

l $version 是Oracle數(shù)據(jù)庫分配的版本號。

17.5.2 使用回收站

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

SQL>FLASHBACK TABLE table_name TO BEFORE DROP

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

示例:本例給出數(shù)據(jù)準備、刪除表、查詢回收站信息、恢復及查詢恢復后的情況。

(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)準備數(shù)據(jù)

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)表后的數(shù)據(jù)字典

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表被刪除以后,在數(shù)據(jù)庫回收站里變成了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 回收站與空間利用

回收站是丟棄對象的邏輯存儲容器,它以表空間中現(xiàn)有的已經(jīng)分配的空間為基礎,這意味著系統(tǒng)并沒有給回收站預留空間。這使回收站空間依賴于現(xiàn)有表空間中的可用空間(也就是說丟棄表占據(jù)的空間仍然需要計入表空間配額)。因此并不能總是保證丟棄對象在回收站中的最小時間。

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

當空間壓力出現(xiàn)時,Oracle會覆蓋些回收站對象從而自動回收表空間。Oracle根據(jù)先 進先出的原則來選擇丟棄對象進行刪除,所以最先被丟棄的對象也最先被清除。而對象的清除僅僅是為了解決產(chǎn)生的空間壓力問題,所以會盡可能清除少的對象來滿 足空間壓力的要求。這樣處理,既最大限度地保證了對象在回收站中的可用時間,又減少了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、嵌套表、索引和分區(qū)等)未必與基表存儲在同一個表空間,該命令會將相依對象從其所在的表空間中進行清除。

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

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

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

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

該命令從用戶回收站中清除所有的對象并釋放與這些對象關聯(lián)的空間。

(7)PURGE DBA_RECYCLEBIN從所有用戶的回收站清除所有對象。

該命令能高效地完全清空回收站,當然執(zhí)行該命令必須具有SYSDBA系統(tǒng)管理權限才可以。

示例:查詢當前用戶回收站中的內(nèi)容,再用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閃回表

今天誤刪除表里面的數(shù)據(jù),通過FLASHBACK閃回,

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

出現(xiàn)因為未啟用行移動功能,不能閃回表。

運行alter table mmdb.column_class_def_t enable row movement;然后再運行FLASHBACK,OK

轉(zhuǎn)自:http://hi.baidu.com/randie/blog/item/dc6c7118b999ab4943a9adc1.html

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI