一、ODU功能的描述:
ODU全称为Oracle Database Unloader,是类似于Oracle的DUL的软件,用于直接从Oracle数据库的数据文件中获取表数据。在各种原因造成的数据库不能打开时,用于抢救数据,最大限度地减少数据丢失。
ODU所拥有的功能特点:
1)支持的Oracle数据库版本包括8i,9i,10g,11g;
2)自动检测数据文件的表空间号和文件号;
3)在有SYSTEM表空间的情况下,自动获取数据字典信息;
4)支持各种表,普通的HEAP表,IOT表,聚簇(CLUSTER)表;
5)支持10g及以上的大文件(BigFile)表空间;
6)列出表的分区和子分区;
7)支持表被truncate、drop后的数据恢复;
8)支持压缩表;
9)支持在没有SYSTEM表空间和数据字典损坏的情况下恢复数据,在没有数据字典可用时,ODU能够自动判断数据的类型;
10)支持IOT表、普通IOT表、压缩IOT表导出;
11)支持IOT表溢出段;
12)支持IOT表分区(包括子分区);
13)只能在有SYSTEM表空间时才能导出IOT表;
14)支持多种平台的数据库;
15)模拟oracle的dump块功能,能够dump数据文件块的数据;
16)支持复制操作系统命令不能复制的坏文件;
17)支持多种字符集之间的转换;
二、基于Truncate表后恢复实践操作
ODU全称为Oracle Database Unloader,是类似于Oracle的DUL的软件,用于直接从Oracle数据库的数据文件中获取表数据。在各种原因造成的数据库不能打开时,用于抢救数据,最大限度地减少数据丢失。
ODU所拥有的功能特点:
1)支持的Oracle数据库版本包括8i,9i,10g,11g;
2)自动检测数据文件的表空间号和文件号;
3)在有SYSTEM表空间的情况下,自动获取数据字典信息;
4)支持各种表,普通的HEAP表,IOT表,聚簇(CLUSTER)表;
5)支持10g及以上的大文件(BigFile)表空间;
6)列出表的分区和子分区;
7)支持表被truncate、drop后的数据恢复;
8)支持压缩表;
9)支持在没有SYSTEM表空间和数据字典损坏的情况下恢复数据,在没有数据字典可用时,ODU能够自动判断数据的类型;
10)支持IOT表、普通IOT表、压缩IOT表导出;
11)支持IOT表溢出段;
12)支持IOT表分区(包括子分区);
13)只能在有SYSTEM表空间时才能导出IOT表;
14)支持多种平台的数据库;
15)模拟oracle的dump块功能,能够dump数据文件块的数据;
16)支持复制操作系统命令不能复制的坏文件;
17)支持多种字符集之间的转换;
二、基于Truncate表后恢复实践操作
1、首先将相关信息配置到ODU中的control.txt文件中,其中control.txt文件是ODU的数据文件信息文件。你可以理解为类似于Oracle数据库的控制文件,存放了ODU导出数据时需要的Oracle数据文件信息,其默认格式:表空间号 文件号 相对文件号 文件名 块大小
select t1.TS#,
t2.FILE_ID,
t2.RELATIVE_FNO,
t2.FILE_NAME,
t2.blocks
from v$tablespace t1,
dba_data_files t2
where t1.NAME = t2.TABLESPACE_NAME
order by t1.TS#;
t2.FILE_ID,
t2.RELATIVE_FNO,
t2.FILE_NAME,
t2.blocks
from v$tablespace t1,
dba_data_files t2
where t1.NAME = t2.TABLESPACE_NAME
order by t1.TS#;
2、在数据库中创建两个测试表t1,t2
SQL> connect easypub/easypub;
SQL> create table t1 as select * from user_objects;
SQL> create table t2 as select * from t1;
之后清空t1表的数据
SQL> truncate table t1;
3、我们OFFLINE掉T1表的表空间、或者关闭数据库、或者关闭所有的应用,目的只有一个,确保空间不会被重用,数据不会被覆盖,然后做个checkpoint,让ODU能够读到最新的数据字典数据。
SQL>select tablespace_name from user_tables where table_name=’T1′;
TABLESPACE_NAME
------------------------------
TBS_CORE
TABLESPACE_NAME
------------------------------
TBS_CORE
SQL> alter tablespace tbs_core offline;
Tablespace altered
SQL> alter system checkpoint;
System altered
Tablespace altered
SQL> alter system checkpoint;
System altered
4、运行ODU,并在提示符下输入命令unload dict,将从SYSTEM表空间中导出数据字典,并存储在后缀名为.odu文件中。
5、获取easypub用户下的T1表,也就是我们要恢复的表的信息:
ODU> desc easypub.t1
6、从上面的输出中,我们可以看到,easypub.t1表所在的表空间号为7,数据段头部为6号文件的7611号块。
7、接下来用ODU扫描表空间的extent:
ODU> scan extent tablespace 7
8、我们使用ODU来确定T1表原来的data object id。一般来说,数据段的数据块,一般是在段头后面相邻的块中。但是我们可以从段头来确认
ODU> dump datafile 6 block 7611
9、从上面的输出中的“Extent 0 : L1 dba:0x01801db9 Date dba:ox01801dbc
段的数据块也就是6号文件的7611
我们dump第6号文件的7611块头,来得到表T1原来的data object id:
ODU> dump datafile 6 block 7611 header;
可以看到,T1表原来的data object id就是60156。
10、使用ODU来unload数据:
ODU> unload table easypub.t1 object 60156;
ODU会自动将恢复的数据添加到data文件中
11、将TBS_CORE表空间ONLINE:
SQL> alter tablespace tbs_core online;
Tablespace altered
Tablespace altered
12、使用sqlldr导入我们恢复的数据即可
13、最后检验恢复的数据是否完全恢复
SQL> select * from t2 minus select * from t1;
未选定行
SQL> select * from t1 minus select * from t2;
未选定行
未选定行
SQL> select * from t1 minus select * from t2;
未选定行
可以看到数据已经完全恢复
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26423870/viewspace-759549/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26423870/viewspace-759549/