Oracle在無備份情況下通過PRM恢復被截斷truncate掉的表

Oracle在無備份情況下通過PRM恢復被截斷truncate掉的表

情況

當某張表被意外truncated掉了,需要恢復其上的所有數據時。表空間的多個數據文件均存放在ASM上,且沒有任何形式的備份。

注意這邊文章針對的是PRM在 數據字典模式下的Truncate恢復選項不可用時使用,數據字典模式下的Truncate恢復選項是最簡單、易用的一種模式,具體使用見《使用PRM恢復Oracle數據庫中誤truncate截斷的表數據》http://www.parnassusdata.com/zh-hans/node/52

 

PRM 3.0的下載地址: http://parnassusdata.com/sites/default/files/ParnassusData_PRMForOracle_3002.zip

PRM 的官方網站: http://www.parnassusdata.com/

 

 

 

PRM背景

PRM恢復表數據時存在多種模式, PRM需要知道哪些表上的數據塊是需要被讀取並取出數據的。默認的表現形式是直接從segment header數據段頭裏獲取EXTENT MAP即盤區圖,另一種方案就是由PRM自己去構建一個盤區圖。 這些盤區圖可以通過,PRM的SCAN DATABASE選項來獲得:    Recovery Wizard => Non-Dictionary Mode,如果是ASM則選擇Non-Dictionary Mode(ASM)

prm-scan-database1

 

也可以在左側屬性圖處選擇SCAN -DATABASE

 

prm-scan-database2

 

 

執行SCAN Database後會生成SEG$和EXT$的數據到PRM內嵌的數據庫中,之後可以選擇SCAN TABLES FROM SEGMENTS 或者 SCAN TABLES FROM EXTENTS。  FROM Segments 意味着使用Segment Header中獲得的Extent MAP信息,而FROM Extents意味着使用PRM自己掃描獲得的EXTENT信息。

 

請注意當TRUNCATE發生後, 數據表Table的Segment Header中的Extent MAP信息就會被清空了, 但實際存放數據的數據塊中的行數據還是在哪裏的,除非被其他數據表/索引的增長而覆蓋了。 所以當Truncate發生後選擇SCAN TABLES FROMSEGMENT  是找不回數據的,必須使用SCAN TABLES FROMEXTENTS, EXTENT的信息是PRM自己去數據文件中掃描獲得的,所以只要有數據的地方PRM就會自己去找到。

 

除了Truncate需要使用到 SCAN TABLES FROM EXTENTS之外對於DROP TABLE的恢復也可以用到SCAN TABLES FROM EXTENTS  , 總之當Segment Header找不到(可能存放Segment Header的數據文件丟失了)、或者已損壞(可能Segment Header的數據塊被損壞了)、或者其中的Extent Map數據無效(Truncate、DROP或邏輯損壞)時都可以使用SCAN TABLES FROM EXTENTS。  

但是如果不存在上述的問題時,建議用SCAN TABLES FROM SEGMENTS  ,因爲從Segment Header獲取信息更方便也更高效一些。

在PRM中同一個程序實例 同時只能使用SCAN TABLES FROM SEGMENTS 或者 SCAN TABLES FROM EXTENTS   中的一個。

 

使用SCAN TABLES FROM EXTENTS   後需要找到對應被TRUNCATE掉的表的原始DATA_OBJECT_ID,即左側屬性圖中的一個對象,並將其DataBridge 數據搭橋傳輸到目標數據庫中即可。

 

prm-scan-database3


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章