当前位置: > 数据库 > Oracle >

真实试验oracle data unloader进行数据恢复

时间:2016-12-09 20:17来源:linux.it.net.cn 作者:IT

oracle的数据恢复方式有很多,但是都比较麻烦,幸好有老熊的ODU的工具,目前这个工具已经不在提供免费的版本,而且听说授权还比较贵,对好的东西的市场化我本人是支持的,但是希望有其他途径可以继续帮助那些像我一样的贫穷的人,毕竟说服老板话费几万银子去买个只能给你用的软件,是很难成功的。幸好还有很多无私的人提供其他的版本,目前可以找到的最新的无限制的版本就是windows下的odu_309,现在网上还有很多下载,itpub上就有,如果大家找不到在联系我。

下面是以一个真实的例子来演示从环境--删除--恢复的全过程,也许很多老手都已经熟悉了,这里只是给自己和新人一个了解的机会,了解我们中国人自己的牛人编写的软件有多牛叉。

一、测试环境搭建
    1.建立测试表空间MYTBS
    create tablespace MYTBS datafile '/opt/oracle/oradata/orcl/mytbs01.dbf' size 10M;

    2.建立测试用户:
    create user james identified james_12345 default tablespace MYTBS;

    3.建立测试表:
    conn james/james_12345
    create table temp(id int,name varchar2(10));
    commit;

    4.建立测试数据:
    begin
      for i in 1..10000
         loop
         insert into temp values(i,'testvalue');
         end loop;
         commit;
    end;

二、模拟truncate 操作:
    1.truncate table temp;
      commit;
    2.触发checkpoint让数据写入数据文件
      alter system checkpoint;

三、准备工作
    1.脱机表空间,防止数据库块被复用
      alter tablespace MYTBS offline;
    2.安装odu,目前只有windows版本没有限制,许可很贵,建议把数据文件拉到 windows下处理
    3. 这一步很重要,需要把删除表所在的表空间MYTBS和 system表空间文件用ssh下载到本地处理

四、恢复操作
    1.修改ODU的control文件
      打开control.txt修改表头为#ts #fno   #rfno     filename只需要这四列就可以
    2.从oracle获取控制信息
      sql>select ts#,file#,rfile#,name from v$datafile;
      这里只需要MYTBS和SYStem表空间信息即可,如。
      0 1 1 /opt/oracle/oradata/orcl/system01.dbf
      6 5 5 /opt/oracle/oradata/orcl/mytbs01.dbf
    3.运行odu.exe
      只要不报错就ok。
    4.unload数据字典
      odu>unload dict
    5.获取temp表逻辑结构,注意大写
      odu>desc james.TEMP
      可以看到类似如下的信息
      Storage(OBj#42252 DataObj#=42255 TS#=6 File#=20 Block#=11 Clister=0)
      这里可以得到表空间号为6
    6.扫描表空间的extend
      ODU>scan extent tablespace 6
    7.恢复数据
      ODU>unload table james.TEMP object auto
      
      至此就可以在data文件夹下看到3个文件,一个是txt数据文件,里面存储的temp表的数据。另外两个是sql*loader使用的文件

,一个是控制文件,一个是建表脚本文件,可以用sql*loader恢复数据导入。
    8.设置表空间联机进行数据导入
      sql>alter tablespace MYTBS online; 

五、模拟恢复删除错误
      1.模拟删除
         insert into temp values(0,'testvalue'); 
         insert into temp values(1,'testvalue');
         insert into temp values(2,'testvalue');
         insert into temp values(3,'testvalue');
         insert into temp values(4,'testvalue');
         delete from temp where id=4;
         commit;
         alter system checkpoint;
         alter tablespace MYTBS offline;
      2.同上的操作,把system和MYTBS表空间的数据文件下载下来
      3.这一步很重要,修改ODU的config.txt增加
         unload_deleted  yes
         如果不增加是无法恢复删除数据的。
      4.ODU下操作:

         unload dict
         desc james.TEMP
         scan extent tablespace 6
         因为temp表还存在直接恢复表数据
         unload table james.TEMP

        这样就可以看到在data下恢复了5条数据。这里有个疑问,加入有个表100万数据,恢复就直接把数据全恢复回来?
        不过好在数据全在,导入测试机器上把数据拿出来就好,毕竟数据在,工作在。

 



(责任编辑:IT)
------分隔线----------------------------