<b>資源回收筒概念</b>
從oracle
10g開始,引入了一個叫資源回收筒(recycle bin)的概念。它的全稱叫tablespace recycle
bin。資源回收筒實際是一個邏輯容器(邏輯區域),原理有點類似于window系統的資源回收筒。它以表空間中現有已經配置設定的空間為基礎,而不是從表空間上實體
劃出一個固定區域用作資源回收筒。這意味着資源回收筒和表空間中的對象共用存儲區域、系統沒有給資源回收筒預留白間。是以,當表被drop後,如果可用空間充足,并且
沒有對資源回收筒進行清理,那麼被drop掉的對象會一直存在資源回收筒中,但是如果可用空間緊張的情況下,資料庫會根據先進先出的順序覆寫recycle
bin中的對象。是以資源回收筒機制也不是百分百的保險機制。另外從原理上來說它就是一個資料字典表,放置使用者drop掉的資料庫對象資訊。使用者進行drop
操作的對象并沒有真正被資料庫删除,仍然會占用空間。除非是由于使用者手工進行purge或者因為存儲空間不夠而被資料庫清掉。資料庫有了這樣的功能,能夠
減少很多不必要的麻煩。當使用者、開發人員、甚至dba誤操作删除了表,那麼我們不必還原整個資料庫或表空間,直接使用oracle
10g的閃回(flashback,閃回)功能來還原被删除的表。這樣我們就能避免大量的人工誤操作。這是一個對dba相當有用的功能。
<b>資源回收筒功能</b>
回
收站這個特性主要的好處就是在誤删除一個表時有一個恢複機制,不必通過資料庫還原來實作。避免大量的人工誤操作。以及資料庫還原等複雜的操作。讓資料庫的
管理、維護更加簡單、友善。如果是sql server資料庫,就必須還原整個資料庫來找到被drop掉的表。可見資源回收筒功能确實是一個開創性的功能。
<b></b>
<b>管理資源回收筒</b>
<b>開啟、關閉資源回收筒</b>
首先你可以通過指令檢視資料庫是否開啟了資源回收筒機制, 如下所示 value= on表示開啟了資源回收筒機制。off則表示資源回收筒機制關閉。
可以通過設定初始化參數recyclebin啟用或禁用資源回收筒功能。當然也可以用指令關閉資源回收筒
可以用指令開啟資源回收筒
<b></b>
<b>檢視資源回收筒對象</b>
我們先來看看一個例子,如下所示,假如不小心誤操作drop了表test,那麼我們如何在資源回收筒檢視被drop的表對象呢?
<b>sql 1:</b>
<b>sql 2: </b>其中recyclebin是user_recyclebin 的同義詞。

<b>sql 3: </b>
--檢視資料庫目前使用者的資源回收筒對象
sql> select * from user_recyclebin;
<b>sql 4: </b>需要相關權限才能查詢。
--檢視資料庫資源回收筒所有對象
sql> select * from dba_recyclebin;
為了避免被删除的表與同類對象名稱的重複,被删除的表以及相依的對象放到資源回收筒後,oracle資料庫會對被删除的對象名稱進行重命名,例如表test表
我們又建立了表test,然後删除了該表test,如下所示,雖然original_name一緻,但是recyclebin name則有所不同。
recyclebin name的命名規則為bin$guid$version 其中guid為globaluid,是一個全局唯一、24個字元長的辨別對象,它是oracle内部使用的辨別。 其中$version是oracle資料庫配置設定的版本号。
<b>還原資源回收筒對象</b>
還原資源回收筒被删除的表、索引等對象, 是通過flashback drop實作的。如下所示。
但是如果出現上面兩個test表都被删除時,此時的flashback drop就有點意思了
如上所示,如果兩個相同名字的表test被删除了,此時閃回被drop的表test,實質是閃回最後一個被删除的表(後進先出原則),如果此時繼續閃回操作就會報ora-38312錯誤
此時可以在閃回過程中對表名進行重命名解決問題。。
另外,如果資源回收筒有兩個被drop掉的表test, 如果想閃回第一個被删除的表,那該怎麼辦呢?
其實這個也很好處理,直接指定recyclebin name進行閃回即可。
<b>清空資源回收筒</b>
資料庫對象删除後,資料庫會把它重命名為bin$開頭的對象,你可以通
過original_name檢視它對應的原始對象名稱。記住,将表放在資源回收筒裡并不在原始表空間中釋放空間。如果您希望完全删除該表,而不讓該表放入回
收站,可以使用以下指令永久删除該表。當然這樣操作後,你也不能通過使用閃回特性閃回該表了。
drop table table_name purge;
如果資料庫中删除表時都放入資源回收筒,因而沒有釋放所占空間,那麼當空閑的空間不足時,已經删除的表是否還會侵占存儲空間呢?
答案很簡單:當表空間被資源回收筒資料完全占滿,以至于必須擴充資料檔案來容納更多資料時,可以說表空間處于“空間壓力”情況下。此時,對象以先進先出的方式從資源回收筒中自動清除。在删除表之前,相關對象(如索引)被删除。
同樣,空間壓力可能由特定表空間定義的使用者限額而引起。表空間可能有足夠的空餘空間,但使用者可能将其在該表空間中所配置設定的部分用完了。在這種情況下,oracle 自動清除該表空間中屬于該使用者的對象。
此外,有幾種方法可以手動控制資源回收筒。如果在删除名為 test 的特定表之後需要從資源回收筒中清除它,可以執行
purge table table_name;
或者使用其資源回收筒中的名稱:
purge table "bin$04lhcpndanfgmaaaaaanpw==$0";
此指令将從資源回收筒中删除表 test 及所有相關對象,如索引、限制等,進而節省了空間。但是,如果要從資源回收筒中永久删除索引,則可以使用以下指令來完成工作:
purge index in_test1_o1;
此指令将僅僅删除索引,而将表的拷貝留在資源回收筒中。有時在更進階别上進行清除可能會有用。例如,您可能希望清除表空間 users 的資源回收筒中的所有對象。可以執行:
purge tablespace users;
您也許希望隻為該表空間中特定使用者清空資源回收筒。在資料倉庫類型的環境中,使用者建立和删除許多臨時表,此時這種方法可能會有用。您可以更改上述指令,限定隻清除特定的使用者:
purge tablespace users user scott;
要釋放整個資源回收筒占用的空間,您需要使用以下指令清空資源回收筒:
purge recyclebin;
記住purge recyclebin隻是清除目前使用者資源回收筒中的對象,dba_recyclebin下的的對象并沒有删除,如果你要清除目前資料庫資源回收筒的對象,必須使用下面指令(dba權限)
purge dba_recyclebin
<b>flashback drop注意事項</b>
1:隻能用于非系統表空間和本地管理的表空間。
如下所示,在系統表空間中,表對象删除後就真的從系統中删除了,而不是存放在資源回收筒中。
2:對象的參考限制不會被恢複,指向該對象的外鍵限制需要重建。
3:對象能否恢複成功,取決于對象空間是否被覆寫重用。
4:當删除表時,依賴于該表的物化視圖也會同時删除,但是由于物化視圖并不會放入recycle binzhong,是以當你執行flashback drop時,
并不能恢複依賴其的物化視圖。需要dba手工重建。
5:對于資源回收筒(recycle bin)中的對象,隻支援查詢。不支援任何其他dml、ddl等操作。