今天在SOA應用資料庫上運用DBMS_REDEFITION包進行線上非分區表轉換分區表操作時,本想DROP掉建的臨時表cube_scope_temp不小心後面忘記加"temp"直接執行了,我等意識到這個問題的時候已經晚了,因為項目建設等遺留問題,資料庫是非歸檔模式,也沒有做備份,因為怕影響業務,一時也沒想到oracle資源回收筒recyclebin這個方法,直接将備份的建表語句建立了表,保證了業務正常開展,正苦于怎麼恢複資料時,突然想oracle 10g提供了資源回收筒這個特性,成功實施資料恢複! oracle 資源回收筒recyclebin是10g才有的新特性,當我們drop table cube_scope 【purge】時,如果不指定purge時,系統隻是将這個表重命名為BIN$開頭的名稱,并在資料字典中修改了相關資料,表所占用的實體空間并沒有真正的回收,此時所占用的空間還是原來的表空間,當表空間不夠用時,ORACLE會跟據DROPSCN#自動進行逐個清理資源回收筒中對像所占用的空間,10g預設是打開資源回收筒功能的。 一、如何檢視是否開啟資源回收筒功能? SQL> show parameter recyclebin NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ recyclebin string on on:表示表空間啟用的資源回收筒功能,建議所有資料都開啟這個功能,百利而無一害! 備注:該參數可以設定成session級别打開,也可以設定成system級别,不用重新開機就可以生效 二、如何不經過資源回收筒直接删除并釋放所占用空間? SQL> drop table cube_scope purge 備注:此指令相當于truncate+drop操作,一般不建議這麼操作! 三、如何将資源回收筒recyclebin中的對像還原? SQL> flashback table cube_scope to before drop 表名可以是資源回收筒系統的dba_recyclebin.object_name也可以是dba_recyclebin.original_name 但是此時問題來了,我已經用備份的DDL語句重建了一個新的表,這個時候再用此指令還原顯然會報錯,這個時候怎麼辦呢,隻能還原成一個别名,具體操作指令是 SQL> flashback table cube_scope before drop rename to cube_scope_old 既然恢複了删除前的表中資料,現在隻能從cube_scope_old中的資料插入cube_scope中 SQL> insert into cube_scope select * from cube_scope_old t 成功恢複了資料,是不是可以收工了?沒有,還有什麼忘記做了?想想? 注意:如果将表drop掉,那麼索引也被drop掉了,用這種方法把表找回來了,但是你的索引呢?你的限制呢?表恢複後一定要将表上的索引重建建立起來(切記),索引丢了最多影響性能,限制沒了可能會造成業務資料混亂(一定要注意) 四、如何手工清除資源回收筒中的對像? SQL> purge table orabpel.cube_scope_old --清除具體的對像 注意:如果此時是DBA使用者操作其它使用者資料,清除資源回收筒中的表時要加上使用者名,否則報表不在資源回收筒中 SQL> purge tablespace ORAPEL --清除指定的表空間對像 SQL> purge tablespace ORAPEL user orabpel --删除表空間指定使用者下的所有對像 SQL> purge recyclebin --清空整個資源回收筒 五、show recyclebin為什麼沒有資料呢? 首先們需要明白一點,recyclebin是user_recyclebin的同義詞,如此你目前的登陸使用者是system此時運用 show recyclebin是沒有資料據的 六、如果同一對像多次删除怎麼在recyclebin中識别? dba_recyclebin中對每删除一個對像都會以BIN$進行命名,同時會有相應的dropscn、createtime、droptime可以跟據這些對像進行定位,然後進行恢複 七、ORACLE空間利用原則 1. 使用現有的表空間的未使用空間 2. 如果沒有了空閑空間,則檢查資源回收筒,對于資源回收筒的對象按照先進先出的原則,對于最先删除的對象, oracle在空間不足之時會最先從資源回收筒删除以滿足新配置設定空間的需求 3. 如果資源回收筒也沒有對象可以清理,則檢查表空間是否自擴充,如果自擴充則擴充表空間,然後配置設定新空 間 4.如果表空間非自擴充,或者已經不能自擴充(到達最大限制),則直接報表空間不足錯誤,程式終止 八、DROP掉的對像是不是都會經過資源回收筒? 以下幾種drop不會将相關對像放進資源回收筒recyclebin中 * drop tablespace :會将recyclebin中所有屬于該tablespace的對像清除 * drop user :會将recyclebin中所有屬于該使用者的對像清除 * drop cluster : 會将recyclebin中所有屬于該cluster的成員對像清除 * drop type : 會将recyclebin中所有依賴該type對像清除 另外還需要注意一種情況,對像所在的表空間要有足夠的空間,不然就算drop掉經過recyclebin由于空間不足oracle會自動删除的哦(切記)!