本次测试采用老的免费的ODU版本,网络上可以找到该免费版本。新版本支持更多的特性,为了生活老熊大师是要收费的
【引用】ODU全称为Oracle Database Unloader,是由OracleODU开发的类似于Oracle的DUL(Oracle内部著名的数据库恢复工具)的一款恢复软件,用于直接从Oracle数据库的数据文件中获取表数据。在各种原因造成的数据库不能打开时,用于抢救数据,最大限度地减少数据丢失。在没有备份或有效备份,或者常规恢复失效的情况下,可作为最后的恢复手段。
【测试】
truncate table b.T;
下载解压odu,如odu_309_win32.tarSQL> select tablespace_name from user_tables where table_name='T';
TABLESPACE_NAME
--------------------
TBS_BLOCK
SQL> alter tablespace TBS_BLOCK offline;
SQL> alter system checkpoint;
修改ODU控制文件control.txt
SQL> select ts#,file#,rfile#,name,block1_offset From v$datafile; 将输出结果写入到control.txt中,如下
#ts #fno #rfno filename block_size
0 1 1 F:\ORACLE\ORADATA\TEST\SYSTEM01.DBF 8192
1 3 3 F:\ORACLE\ORADATA\TEST\SYSAUX01.DBF 8192
2 5 5 F:\ORACLE\ORADATA\TEST\UNDOTBS01.DBF 8192
3 6 6 F:\ORACLE\ORADATA\TEST\USERS01.DBF 8192
5 7 10 F:\ORACLE\ORADATA\TEST\EXAMPLE01.DBF 8192
7 8 8 F:\ORACLE\PRODUCT\12.1.0\DBHOME_1\ORADATA\CCDATA.DBF 8192
8 9 9 F:\ORACLE\ORADATA\TEST\TBS_BLOCK.DBF 8192
注:另外一个配置文件是config.txt里面可以定义字符集、sqlldr分割符等。
运行ODU
ODU> open
ODU> unload dict
ODU> desc b.T
Object ID:99235
Storage(Obj#=99235 DataObj#=99239 TS#=8 File#=9 Block#=10 Cluster=0)
ODU> scan extent tablespace 8
ODU> unload table b.T
Unloading table: T,object ID:99235
Unloading segment,storage(Obj#=99235 DataObj#=99239 TS#=8 File#=9 Block#=10 Cluster=0)
0 rows unloaded
找出objectid后进行恢复
ODU> unload table b.T object 99235
Unloading table: T,object ID:99235
Unloading segment,storage(Obj#=99235 DataObj#=99239 TS#=8 File#=9 Block#=10 Cluster=0)
5841 rows unloaded
注:从3.0.7版本开始,对truncate table的支持更方便。可能不用人工去找到原来的data object id,而支持使用:unload table username.tablename object auto
看到数据已经被unloaded出来了,同时在ODU的data目录下会生成sqlloader脚本,直接调用sqlldr就可以恢复被truncate的数据了。保险起见,在另一个用户下进行恢复,确认数据无误后再导入到原来的用户及对应表空间(开始时被offline的TBL_BLOCK)中
1、执行生成的ODU_0000099235.sql 脚本,创建表;
2、sqlldr z/z control='F:\oracle\odu_309_win32\odu\data\ODU_0000099241.ctl'
更多推荐
非常规数据恢复的几种场景(利用ODU恢复被truncate的表)
发布评论