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

原文地址:https://www.cnblogs.com/xiaoL/p/2391838.html