• truncate数据后用Oracle数据恢复工具ODU


    1。ODU 介绍

          

          ODU全称为Oracle Database Unloader,是类似于Oracle的DUL的软件,用于直接从Oracle数据库的数据文件中获取表数据。在各种原因造成的数据库不能打开时,用于抢救数据,最大限度地减少数据丢失。

          支持的Oracle数据库版本包括8i,9i,10g,11g   

          今天是在ORACLE11G下测试完成了通过ODU对TRUNCATE的表数据如何进行恢复;

    2。ODU 版本及下载

    3。使用及配置

           下载到ODU的Windows版本,是一个ZIP压缩文件,解压缩到一个目录,有如下的文件和目录:

          

     config.txt文件是ODU的配置文件,我们不需要理会;

    control.txt文件是ODU的数据文件信息文件。你可以理解为类似于Oracle数据库的控制文件,存放了ODU导出数据时需要的Oracle数据文件信息。这个文件需要我们自己配置(手工把数据文件块等信息加入这个配置文件,以便ODU进行读取)

    control.txt文件中的数据格式为:

    表空间号 文件号 相对文件号 文件名 块大小

    通过V$DATAFILE 找到相应的信息,加入配置文件,只需要前4列就好了。

    我的配置文件如下,这里的格式怎么样都没关系。

    #ts    #fno     #rfno   filename
    0 1 1 D:/APP/ADMINISTRATOR/ORADATA/ZFTANG/SYSTEM01.DBF
    1 2 2 D:/APP/ADMINISTRATOR/ORADATA/ZFTANG/SYSAUX01.DBF
    2 3 3 D:/APP/ADMINISTRATOR/ORADATA/ZFTANG/UNDOTBS01.DBF
    4 4 4 D:/APP/ADMINISTRATOR/ORADATA/ZFTANG/USERS01.DBF
    6 5 5 D:/APP/ADMINISTRATOR/ORADATA/ZFTANG/EXAMPLE01.DBF
    7 6 6 D:/APP/ADMINISTRATOR/ORADATA/ZFTANG/USERS02.DBF
    8 7 7 D:/APP/ADMINISTRATOR/ORADATA/ZFTANG/USERS03.DBF

    4。恢复方法

      

     对于ODU来说,  3.0.7版本及以后,恢复方法比较简单,具体操作如下:下面以TEST_01表进行测试:

    检查TEST_01表数据,

    然后对于表进行TRUNCATE 操作,truncate table test_01.此时数据已经被清空,我们需要进行恢复/

    a):把TEST_01表所在的表空间进行OFFLINE操作:alter tablespace USERS offline;

    b):启动ODU,启动界面如图所示,进行读取配置:

         

          

        c):输入:unload dict;进行扫描,结果如下图:

           

          

      d):scan extent ,根据数据文件块多少等,时间稍微有点长,结果如下

            

    e):通过自动恢复,进行恢复表数据:unload table username.tablename object auto

        

          

      f):设置表空间ONLINE ALTER TABLESPACE USERS ONLINE;

           结束。。

    备注:还可以数据不进行恢复,只把数据导出来,

             只需要执行命令:

    ODU> unload table zftang.test_01

    Unloading table: T1,object ID: 31388
    Unloading segment,storage(Obj#=31388 DataObj#=31388 TS#=11 File#=10 Block#=1465 Cluster=0)

    执行完此命令后,会在data目录下生成三个文件:

    ZFTANG_TEST_01.ctl是用于sqlldr装入数据所需要的控制文件,ZFTANG_TEST_01.sql是建表SQL脚本,ZFTANG_TEST_01.txt是导出的数据。
    我们可以用sql文件建表,然后使用sqlldr装入数据。
    --EOF
     
    http://1327236.blog.51cto.com/1317236/515191 

    Oracle数据恢复工具-ODU

    2011-03-14 18:35:36
    标签:oracle
    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://1327236.blog.51cto.com/1317236/515191

    ODU全称为Oracle Database Unloader,偶然在ITPUB看到一款数据小工具,创作者-老熊,网站地址为http://www.laoxiong.net/odu

    初试了一下,工具虽小但功能挺强大的,通过直接扫描数据文件来获取误删的数据,在某些情况下合理使用能发挥很不错的效果。

    将自己的其中一个测试过程发布在这里:

     

     

    三、恢复truncate的表


    被Truncate的表,只要原来的空间没有被重用(即数据被覆盖),则数据都是可以恢复的。
    如果发现一个表被意外地Truncate,而需要马上恢复。首先要做的就是关闭数据库,或者OFFLINE那个表所在的表空间,或者关闭所有应用。目的只有一个,确保空间不会被重用,数据不会被覆盖。


    1、创建测试场景

    建立测试表空间、数据文件、测试用户、测试表
    CREATE TABLESPACE ODU
    LOGGING 
    DATAFILE
    'E:\ORACLE\PRODUCT\10.2.0\ORADATA\JIONG\ODU.ORA' SIZE 100M    
    AUTOEXTEND 
    ON NEXT 64M MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL 
    SEGMENT SPACE MANAGEMENT  AUTO;
    CREATE USER odu identified by odu default tablespace ODU;
    grant connect,dba to odu;
    create table test(id number(9),name varchar2(50));
    begin
      for i in 1 .. 100 loop
        insert into test (id, name) values (i, 'adasda');
      end loop;
      commit;
    end;

    执行truncate
    truncate table test;


    2、准备恢复

    数据库做一个Checkpoint,让ODU能够读到最新的数据字典数据。
    alter system checkpoint;

    将相关数据文件拷出
    SYSTEM01.DBF
    SYSTEM02.DBF
    ODU.ORA
    将system数据文件位置配置进ODU的control.txt文件:
    可以预先查询数据字典设置内容:
    select d.TS#        ts,
           d.FILE#      fno,
           d.FILE#      fno,
           d.NAME       filename,
           d.BLOCK_SIZE block_size
      from v$datafile d
     order by ts;
     修改filename的路径,将如下内容写入control.txt并保存
    0 1 1 D:\odu\SYSTEM01.DBF 8192
    0 13 13 D:\odu\SYSTEM02.DBF 8192
    16 16 16 D:\odu\ODU.ORA 8192


    3、进行恢复

    点击odu.exe进入命令行界面
    unload数据字典
    ODU> unload dict
    获取需要恢复的表的信息
    ODU> desc odu.test
    输出如下:
    Object ID:61536
    Storage(Obj#=61536 DataObj#=61537 TS#=16 File#=16 Block#=11 Cluster=0)

    NO. SEG INT Column Name                    Null?     Type

    --- --- --- ------------------------------ --------- -------------------
    ---
      1   1   1 ID                                       NUMBER(9)

      2   2   2 NAME                                     VARCHAR2(50)

      可以看到,odu.test表所在的表空间号为16,数据段头部为16号文件的11号块。data object id为Obj#=61536

    扫描表空间的extent
    ODU> scan extent tablespace 16
    输出如下:
    scan extent start: 2011-01-20 16:11:09
    scanning extent...
    scanning extent finished.
    scan extent completed: 2011-01-20 16:11:13

    ODU> dump datafile 16 block 11  dump数据文件数据块

    unload数据:
    ODU> unload table odu.test object 61536
    输出如下:
    Unloading table: TEST,object ID: 61536
    Unloading segment,storage(Obj#=61536 DataObj#=61536 TS#=16 File#=16 Block#=11 Cl
    uster=0)
    100 rows unloaded

    执行完后,会在ODU目录的DATA文件夹中生成三个文件(默认生成SQLLDR文件时):
    ODU_TEST.ctl     控制文件
    ODU_TEST.txt     文本数据文件
    ODU_TEST.sql    表创建的DDL语句

    使用SQLLDR导入数据
    D:\odu\data>sqlldr odu/odu@jiong control=ODU_TEST.ctl

    至此,数据恢复完成。

    新版本中支持的更好,恢复命令不需要查询object_data_id:
    ODU> unload table username.tablename object auto

    本文出自 “开开心心每一天” 博客,请务必保留此出处http://1327236.blog.51cto.com/1317236/515191 

     http://rocolex.blog.163.com/blog/static/68446410201158548933/

    sqlldr工具的使用(批量导入数据) 附sqlldr参数  

    2011-06-08 17:04:08|  分类: Oracle|字号 订阅

    转自:http://linjianqing.iteye.com/blog/501563

    一,sql*load

    作用:可以将文本文件导入到表中

    步骤:

         1,oracle数据库端必须已经较好了需要导入的数据表结构

         2,一个数data文件 如:model.txt

         3,手工编辑一个control文件 如 cont.ctl

         4,命令行加载数据

    示例:

    Sql代码
    1. (1),在oracle中建表的结构   
    2. create table depttest (deptno number(5),   
    3.                              dname varchar2(10),   
    4.                               loc varchar2(20),   
    5.                               constraint pk_depttest primary key(deptno));  

     

    Sql代码
    1. (2) ,data文件数据(源文件数据c:\model.txt)    
    2. 行有规则的文件model.txt如下所示:   
    3. 25,ljq25,bb   
    4. 26,ljq27,dd   
    5. 行无规则的文件model.txt如下所示:   
    6. 222,ljq,b   
    7. 26,ljq22,ddd  

     

    Sql代码
    1. (3),手工编辑一个control文件 如 c:\cont.ctl   
    2.  load data   
    3.  characterset ZHS16GBK        --防止输入的中文乱码   
    4. infile 'e:\sqlldr.txt'  
    5. append   
    6. into table scott.dept2 (   
    7. --按位置来取值,每行字符数都有规则才行(定长字符),排除不需要的字符,如','   
    8. deptno position(1:2) char,             --表示该字段从位置n到m的值   
    9. dname position(4:8) char,   
    10. loc position(10:11) char  
    11. --每行字符分割个数无规则的文件(不定长字符)  terminated by 以...结束(分隔),通用加载方法   
    12. --deptno char terminated by ',',   
    13. --dname char terminated by ',',   
    14. --loc char terminated by ','   
    15. )  

      

    Sql代码
    1. (4),在cmd模式下,命令行执行   
    2. sqlldr <A href="mailto:user/password@orc">user/password@orc</A>l control ='c:\cont.ctl' data='c:\model.txt'  

     具体说明

         1,control文件说明    

    Sql代码
    1. (1)格式   
    2. load data       --控制文件标识   
    3. infile 'c:\model.txt'     --要输入的数据文件名   
    4. append into table username.tablename      
    5.                         --向哪个表追加记录,同一个用户下可以省略username   
    6. fields terminated by '分隔符'  --指定分割符,终止字段值   
    7. (2) 4种表转载方式   
    8. insert:缺省方式,在数据装载时要求表为空   
    9. append:在表中追加新记录   
    10. replace: 原先的表有数据 原先的数据会全部删除     
    11. truncate:同replace  
    12. (3)加载值   
    13. postition(n:m)表示该字段从位置n到m的值   
    14. terminated by 以...结束(分隔),是通用加载方法  

     

       2,上述的加载都是普通加载,现要指定特定列不用加载数据,如模版所示

    Sql代码
    1. load date  
    2. characterset zhs16gbk   
    3. infile  '/home/orcla/model.txt'  
    4. append   
    5. into table db_table   
    6. fields terminated by '分割符' (   
    7.     t_id,   
    8.     t_name,   
    9.     t_date "to_char(":END_DATE/STRT_DATE/UPDATE_TIME,'YYYYMMDDHH24MISS'")   
    10. )   
    11.   
    12. --有些字段不用指定就不会被加载值  

    这个工具可以批量导入数据,具体使用方法如下:
    用法: SQLLDR keyword=value [,keyword=value,...]
    有效的关键字:
        userid -- ORACLE 用户名/口令        
       control -- 控制文件名                
           log -- 日志文件名                    
           bad -- 错误文件名                   
          data -- 数据文件名                  
       discard -- 废弃文件名 
    discardmax -- 允许废弃的文件的数目         (全部默认) 
          skip -- 要跳过的逻辑记录的数目  (默认 0) 
          load -- 要加载的逻辑记录的数目  (全部默认) 
        errors -- 允许的错误的数目         (默认 50) 
          rows -- 常规路径绑定数组中或直接路径保存数据间的行数 
                   (默认: 常规路径 64, 所有直接路径) 
      bindsize -- 常规路径绑定数组的大小 (以字节计)  (默认 256000) 
        silent -- 运行过程中隐藏消息 (标题,反馈,错误,废弃,分区) 
        direct -- 使用直接路径                     (默认 FALSE) 
       parfile -- 参数文件: 包含参数说明的文件的名称 
      parallel -- 执行并行加载                    (默认 FALSE) 
          file -- 要从以下对象中分配区的文件     
    skip_unusable_indexes -- 不允许/允许使用无用的索引或索引分区  (默认 FALSE) 
    skip_index_maintenance -- 没有维护索引, 将受到影响的索引标记为无用  (默认 FALSE) 
    commit_discontinued -- 提交加载中断时已加载的行  (默认 FALSE) 
      readsize -- 读取缓冲区的大小               (默认 1048576) 
    external_table -- 使用外部表进行加载; NOT_USED, GENERATE_ONLY, EXECUTE  (默认 NOT_USED) 
    columnarrayrows -- 直接路径列数组的行数  (默认 5000) 
    streamsize -- 直接路径流缓冲区的大小 (以字节计)  (默认 256000) 
    multithreading -- 在直接路径中使用多线程 
    resumable -- 启用或禁用当前的可恢复会话  (默认 FALSE) 
    resumable_name -- 有助于标识可恢复语句的文本字符串 
    resumable_timeout -- RESUMABLE 的等待时间 (以秒计)  (默认 7200) 
    date_cache -- 日期转换高速缓存的大小 (以条目计)  (默认 1000)
    PLEASE NOTE: 命令行参数可以由位置或关键字指定 

     tips:sqlldr 执行时必须先把路径切换到本路径下

    sqlldr

  • 相关阅读:
    视差滚动(Parallax Scrolling)插件补充
    10个最佳的触控手式的JavaScript框架(转)
    50个必备的实用jQuery代码段(转)
    PhoneGap开发不可或缺的五件装备
    优化移动网站的9大窍门(转)
    WSADATA
    htons
    INADDR_ANY
    SOCKADDR_IN
    mysql_query()与mysql_real_query()
  • 原文地址:https://www.cnblogs.com/xiaoL/p/2391838.html
Copyright © 2020-2023  润新知