清除oracle的recyclebin回收站

小亮520cl發表於2015-08-05

Oracle10g提供了類似作業系統中的回收站功能。回收站,從原理上來說就是一個資料字典表,放置使用者Drop掉的資料庫物件資訊。當drop table的時候,實際上只是將其重新命名,並將table以及相關聯的物件如index,constraint等放到回收站(RecycleBin)中,後續如果發現drop錯了table,可以使用flashback table命名將回收站中的table還原,這就是Oracle10g的Flashback Drop功能。

1.        啟用/禁用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;

會話已更改。

2.        檢視回收站:

SQL> SHOW recyclebin;

或者

SQL>select * from recyclebin;

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

3.        回收站物件的操作:

當一個表被刪除並移動到"回收站"中,它的名字要進行一些轉換。這樣的目的是為了避免同類物件名稱的重複。(這一點和Windows作業系統的回收站不同,Windows中的回收站經過了特殊的處理,作業系統檔案可以重名。)轉換後的名字格式如下:

BIN$unique_id$version其中BIN代表RecycleBin,unique_id是資料庫中該物件的唯一標誌,26個字元長度version表示該物件的版本號。

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

drop tablespace:會將RecycleBin中所有屬於該tablespace的物件清除

drop user:會將RecycleBin中所有屬於該使用者的物件清除

drop cluster:會將RecycleBin中所有屬於該cluster的成員物件清除

drop type:會將RecycleBin中所有依賴該type的物件清除

l        已經放到回收站裡的表是不能用drop命令刪除的(注意物件名字上的雙引號):

SQL> DROP table "BIN$V3f/oYUITrCEF2cotS5JaA==$0" ;

DROP table "BIN$V3f/oYUITrCEF2cotS5JaA==$0"

*

ERROR at line 1:

ORA-38301: can not perform. DDL/DML over objects in Recycle Bin

如果要清掉該物件,使用purge命令:

SQL> PURGE table "BIN$V3f/oYUITrCEF2cotS5JaA==$0" ;

Table purged.

l        如果直接清空所有的Recycle Bin中的物件:

SQL> PURGE RECYCLEBIN;

Recyclebin purged.

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

l        恢復表,用回閃表的功能:

SQL> FLASHBACK TABLE table_name TO BEFORE DROP;

Flashback complete.

預設的恢復是第一個被刪除的表。如果要恢復指定的表,可以在FLASHBACK TABLE後面加上指定的RECYCLEBIN引數指定其他的名字:

語句FLASHBACK TABLE [已刪除TABLE名|"RECYCLEBIN中的名字"] TO BEFORE DROP;

但當你在RECYCLEBIN內有2張相同名字的表時候,只有透過"RECYCLEBIN中的名字"來閃回指定的表,用上面方法只閃回第一個被刪除的同名表。

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

表空間已清除。

l        清除表時,同時也會清除依賴這張表的約束,如索引。可以指定只清除表相應的約束,如:PURGE INDEX IDX_TEST。

表上的物件如索引、觸發器在表被閃回後是不會被同時閃回的,而是保持了在回收站中名字。一些依賴這張表的程式碼物件如檢視、儲存過程在表被刪除後會失效,在表被閃回後不會被自動重新編譯,而要手工重新編譯他們。相關的資訊被儲存在檢視USER_RECYCLE中。可以用以下語句來獲得這些索引、觸發器物件的原有名稱:

1 SQL> SELECT OBJECT_NAME, ORIGINAL_NAME, TYPE

2 FROM USER_RECYCLEBIN
 
3 WHERE BASE_OBJECT = (SELECT BASE_OBJECT FROM  USER_RECYCLEBIN
  
4 WHERE ORIGINAL_NAME = 'ABC')
  
5 AND ORIGINAL_NAME != 'ABC';
  
OBJECT_NAME ORIGINAL_N TYPE
  
------------------------------ ---------- --------
  BIN$1++ilvsQQ7mfPh2pvont5A==$0 IDX_TEST INDEX

可以用以下方式來恢復索引:

SQL> ALTER INDEX " BIN$1++ilvsQQ7mfPh2pvont5A==$0" RENAME TO IDX_TEST;

  一個例外就是點陣圖索引被刪除後是不會被儲存在回收站中的,也無法從上述檢視中查到,需要用其他方式來恢復。

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

相關文章