ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 基于ODU恢复truncate表的总结操作

基于ODU恢复truncate表的总结操作

原创 Linux操作系统 作者:咏春1233 时间:2013-04-30 17:40:23 0 删除 编辑
一、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表后恢复实践操作
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#;
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
SQL> alter tablespace tbs_core offline;
 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
12、使用sqlldr导入我们恢复的数据即可
13、最后检验恢复的数据是否完全恢复
SQL> select * from t2 minus select * from t1;
未选定行
SQL> select * from t1 minus select * from t2;
未选定行
可以看到数据已经完全恢复
 
 
 
 

显示结果1.jpg

显示desc结果2.jpg

显示scan结果.jpg

显示dump datafile结果.jpg

显示dump datafile head结果.jpg

显示unload table 结果.jpg

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26423870/viewspace-759549/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2013-02-21

  • 博文量
    5
  • 访问量
    7484