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)
也可以在左側屬性圖處選擇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 數據搭橋傳輸到目標數據庫中即可。