Oracle在無備份情況下通過PRM恢複被截斷truncate掉的表
2014/06/18 by Maclean Liu 暫無評論
情況
當某張表被意外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)

也可以在左側屬性圖處選擇SCAN -DATABASE
執行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 資料搭橋傳輸到目标資料庫中即可。