使用ODU恢復oracle被truncate的表資料

hunterjoy發表於2015-10-23
使用ODU恢復oracle被truncate的表資料


1。ODU 介紹

      ODU全稱為Oracle Database Unloader,是類似於Oracle的DUL的軟體,用於直接從Oracle資料庫的資料檔案中獲取表資料。在各種原因造成的資料庫不能開啟時,用於搶救資料,最大限度地減少資料丟失。


      支援的Oracle資料庫版本包括8i,9i,10g,11g,12c


      今天是在ORACLE11G下測試完成了透過ODU對TRUNCATE的表資料如何進行恢復;


2。ODU 版本及下載





Windows版本:odu_309_win32.zip (770KB)
Linux版本:odu_308_linux_x86.tar.gz (1064KB)
Solaris版本:odu_306_sol_x86.tar.gz (766KB)
AIX版本:odu_308_aix53.tar.gz (1344KB)
HP PA-RISC2.0版本:odu_308_hppa.tar.gz (926KB)
HP IA64版本:odu_308_hp_ia64.tar.gz (896KB)
3。使用及配置
 config.txt檔案是ODU的配置檔案,我們不需要理會;


control.txt檔案是ODU的資料檔案資訊檔案。你可以理解為類似於Oracle資料庫的控制檔案,存放了ODU匯出資料時需要的Oracle資料檔案資訊。這個檔案需要我們自己配置(手工把資料檔案塊等資訊加入這個配置檔案,以便ODU進行讀取)


control.txt檔案中的資料格式為:


表空間號 檔案號 相對檔案號 檔名 塊大小


透過V$DATAFILE 找到相應的資訊,加入配置檔案,只需要前4列就好了。

#ts    #fno     #rfno   filename
0   1     1       /u01/app/oracle/oradata/PROD1/system01.dbf
7   6     6       /u01/app/oracle/oradata/PROD1/TS_TEST 


查詢資訊,新增到control檔案中
select tablespace_name from dba_tables where table_name='TEST';


SYS@PROD1> select ts#,name from v$tablespace;


       TS# NAME
---------- ------------------------------
         0 SYSTEM
         1 SYSAUX
         2 UNDOTBS1
         4 USERS
         3 TEMP
         6 EXAMPLE
         7 TS_TEST


7 rows selected.


 select file#,ts#, RFILE#,NAME from v$datafile where ts#=7;

[oracle@enmoedu1 odu]$ vi control.txt
#ts fno   rfno     filename                                          block_size  is_big_file header_offset blocks 
0   1     1       /u01/app/oracle/oradata/PROD1/system01.dbf
7   6     6       /u01/app/oracle/oradata/PROD1/TS_TEST 


4。恢復方法
  
 對於ODU來說,  4.1.3版本及以後,恢復方法比較簡單,具體操作如下:下面以TEST表進行測試:
檢查TEST表資料,

然後對於表進行TRUNCATE 操作,truncate table test.此時資料已經被清空,我們需要進行恢復/

4.1):把TEST表所在的表空間進行OFFLINE操作:alter tablespace TS_TEST offline;

4.2):啟動ODU,啟動介面如圖所示,進行讀取配置:


4.3):輸入:unload dict;進行掃描,結果如下圖:
ODU> unload dict
CLUSTER C_USER# file_no: 1 block_no: 208
TABLE OBJ$ file_no: 1 block_no: 240
CLUSTER C_OBJ# file_no: 1 block_no: 144
CLUSTER C_OBJ# file_no: 1 block_no: 144
found IND$'s obj# 19
found IND$'s dataobj#:2,ts#:0,file#:1,block#:144,tab#:3
found TABPART$'s obj# 568
found TABPART$'s dataobj#:568,ts#:0,file#:1,block#:3872,tab#:0
found INDPART$'s obj# 573
found INDPART$'s dataobj#:573,ts#:0,file#:1,block#:3912,tab#:0
found TABSUBPART$'s obj# 580
found TABSUBPART$'s dataobj#:580,ts#:0,file#:1,block#:3976,tab#:0
found INDSUBPART$'s obj# 585
found INDSUBPART$'s dataobj#:585,ts#:0,file#:1,block#:4016,tab#:0
found IND$'s obj# 19
found IND$'s dataobj#:2,ts#:0,file#:1,block#:144,tab#:3
found LOB$'s obj# 80
found LOB$'s dataobj#:2,ts#:0,file#:1,block#:144,tab#:6
found LOBFRAG$'s obj# 601
found LOBFRAG$'s dataobj#:601,ts#:0,file#:1,block#:4144,tab#:0




4.4):scan extent ,根據資料檔案塊多少等,時間稍微有點長,結果如下
ODU> scan extent


scan extent start: 2015-10-23 10:26:22
scanning extent...
scanning extent finished.
scan extent completed: 2015-10-23 10:26:32
  
4.5):透過自動恢復,進行恢復表資料:unload table username.tablename object auto


    
ODU> unload table linfy.test object 80907


Unloading table: TEST,object ID: 80907
Unloading segment,storage(Obj#=80907 DataObj#=80907 TS#=7 File#=6 Block#=68738 Cluster=0)
1 rows unloaded
 
4.6):設定表空間ONLINE ALTER TABLESPACE TS_TEST ONLINE;


執行完此命令後,會在data目錄下生成三個檔案:
 
LINFY_TEST.ctl是用於sqlldr裝入資料所需要的控制檔案,LINFY_TEST.sql是建表SQL指令碼,LINFY_TEST.txt是匯出的資料。
我們可以用sql檔案建表,然後使用sqlldr裝入資料。
 
 sqlldr linfy/linfy control=LINFY_TEST.ctl
 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/543979/viewspace-1815830/,如需轉載,請註明出處,否則將追究法律責任。

相關文章