標籤:style color io 使用 ar strong for 資料 問題
今天在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會自動刪除的哦(切記)!
======================================================================================
注意:
一、show recyclebin指令只能在非system使用者下可以查看資源回收筒中儲存的目前使用者下的被刪除對象。
因為:閃回技術只能保護非系統資料表空間中的表,而且這些表還必須儲存在本地管理的資料表空間中,在一個表被刪除時依賴於該表的絕大多數的資料庫物件也受到資源回收筒的保護。但是位元影像索引(bitmap index)和參考完整性約束(外鍵約束)等並不受到資源回收筒的保護。
二、閃回刪除的表以後建立在該表上的主鍵約束,主鍵對應的唯一索引等都會被連帶閃回,但是約束的名字和索引的名字是按照recyclebin的命名規則命名的。並且在閃回以後不能rename和drop必須使用閃回後 的名稱。
oracle recyclebin詳解