ODU快速上手

本文将以ODU 2.1.0 for Windows版,介绍如何使用ODU。本文只是一个快速上手指南,以后将详细介绍ODU的使用。

在本网站下载到ODU的Windows版本,是一个ZIP压缩文件,解压缩到一个目录,比如解压到d:\,将会看到d:\odu目录下有如下的文件和目录:

D:\odu>dir
驱动器 D 中的卷没有标签。
卷的序列号是 045E-00DE

D:\odu 的目录

2009-02-08  22:12    <DIR>          .
2009-02-08  22:12    <DIR>          ..
2009-02-08  01:16               218 config.txt
2009-02-08  01:16                99 control.txt
2009-02-08  22:12    <DIR>          data
2004-10-14  00:08           978,432 libiconv2.dll
2009-02-08  19:00           135,168 odu.exe
               4 个文件      1,113,917 字节
               3 个目录  1,738,174,464 可用字节

D:\odu>

如果没有data目录,请手工新建一个。

config.txt文件是ODU的配置文件,默认的配置数据如下:

byte_order little
block_size 8192
data_path data
lob_path lob
charset_name ZHS16GBK
ncharset_name AL16UTF16
output_format text
lob_storage file
clob_byte_order little
trace_level 1
file_header_offset 0
delimiter |

默认的配置基本能满足大部分的需求。

control.txt文件是ODU的数据文件信息文件。你可以理解为类似于Oracle数据库的控制文件,存放了ODU导出数据时需要的Oracle数据文件信息。

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

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

每列之间用空白分隔,可以只需要前四列,即块大小和是否大文件表空间可省略,块大小省略时,数据文件的默认块大小为config.txt中block_size的大小。下面是一个示例的数据:

#ts #fno   #rfno     filename                                          block_size    bigfile
        0          1          1 D:\ORACLE\ORADATA\XJ\SYSTEM01.DBF              4096    
        1          2          2 D:\ORACLE\ORADATA\XJ\UNDOTBS01.DBF             4096
        3          3          3 D:\ORACLE\ORADATA\XJ\DRSYS01.DBF               4096
        4          4          4 D:\ORACLE\ORADATA\XJ\EXAMPLE01.DBF             4096
        5          5          5 D:\ORACLE\ORADATA\XJ\INDX01.DBF                4096
        6          6          6 D:\ORACLE\ORADATA\XJ\ODM01.DBF                 4096
        7          7          7 D:\ORACLE\ORADATA\XJ\TOOLS03.DBF               4096
        7          8          8 D:\ORACLE\ORADATA\XJ\TOOLS02.DBF               4096
        9          9          9 D:\ORACLE\ORADATA\XJ\XDB01.DBF                 4096
       11         10         10 D:\ORACLE\ORADATA\XJ\TEST01.DBF                2048
       14         11         11 D:\ORACLE\ORADATA\XJ\K16.DBF                  16384

如果数据文件头是完好的,则ODU会自动从文件头里面获取表空间号,文件号,相对文件号,文件块大小等。表空间号,文件号和相对文件号可以写为0。
注意:ODU将检查control.txt文件中的第一个数据文件是否为SYSTEM表空间文件,所以要将SYSTEM表空间的第1个文件放在control.txt文件中的第一行。否则将不能自动获得数据字典数据。

运行odu命令,显示如下的信息:

Oracle Data Unloader:Release 2.1.0

Copyright (c) 2008,2009 XiongJun. All rights reserved.

Web: http://www.laoxiong.net
Email: magic007cn@gmail.com

loading default config.......

byte_order little
block_size 8192
data_path data
lob_path lob
charset_name ZHS16GBK
ncharset_name AL16UTF16
output_format text
lob_storage file
clob_byte_order little
trace_level 1
delimiter |

load control file 'config.txt' successful
loading default control file ......

load control file 'config.txt' successful
loading default control file ......

 ts#   fn  rfn bsize   blocks bf filename
---- ---- ---- ----- -------- -- --------------------------------------------
   0    1    1  4096   128000 N  D:\ORACLE\ORADATA\XJ\SYSTEM01.DBF
   1    2    2  4096    51200 N  D:\ORACLE\ORADATA\XJ\UNDOTBS01.DBF
   3    3    3  4096     5120 N  D:\ORACLE\ORADATA\XJ\DRSYS01.DBF
   4    4    4  4096    37280 N  D:\ORACLE\ORADATA\XJ\EXAMPLE01.DBF
   5    5    5  4096     6400 N  D:\ORACLE\ORADATA\XJ\INDX01.DBF
   6    6    6  4096     5120 N  D:\ORACLE\ORADATA\XJ\ODM01.DBF
   7    7    7  4096     5120 N  D:\ORACLE\ORADATA\XJ\TOOLS03.DBF
   7    8    8  4096      512 N  D:\ORACLE\ORADATA\XJ\TOOLS02.DBF
   9    9    9  4096     9760 N  D:\ORACLE\ORADATA\XJ\XDB01.DBF
  11   10   10  2048    56655 N  D:\ORACLE\ORADATA\XJ\TEST01.DBF
  14   11   11 16384      256 N  D:\ORACLE\ORADATA\XJ\K16.DBF
load control file 'control.txt' successful
loading dictionary data......

ODU>

显示完上面的信息后,将会显示如sqlplus类似的提示符“ODU >",在此提示符下,输入命令。

输入命令unload dict,将从SYSTEM表空间中导出数据字典,并存储在.odu文件中。下次打开odu时,odu会自动从生成的文件中装入数据字典。unload dict命令显示的结果如下:

ODU> unload dict
CLUSTER C_USER# file_no: 1 block_no: 177
TABLE OBJ$ file_no: 1 block_no: 241
CLUSTER C_OBJ# file_no: 1 block_no: 49
CLUSTER C_OBJ# file_no: 1 block_no: 49
found IND$'s obj# 19
found IND$'s dataobj#:2,ts#:0,file#:1,block#:49,tab#:3
found TABPART$'s obj# 230
found TABPART$'s dataobj#:230,ts#:0,file#:1,block#:3313,tab#:0
found INDPART$'s obj# 234
found INDPART$'s dataobj#:234,ts#:0,file#:1,block#:3377,tab#:0
found TABSUBPART$'s obj# 240
found TABSUBPART$'s dataobj#:240,ts#:0,file#:1,block#:3473,tab#:0
found INDSUBPART$'s obj# 245
found INDSUBPART$'s dataobj#:245,ts#:0,file#:1,block#:3553,tab#:0
found IND$'s obj# 19
found IND$'s dataobj#:2,ts#:0,file#:1,block#:49,tab#:3
found LOB$'s obj# 156
found LOB$'s dataobj#:2,ts#:0,file#:1,block#:49,tab#:6
found LOBFRAG$'s obj# 258
found LOBFRAG$'s dataobj#:258,ts#:0,file#:1,block#:3761,tab#:0
ODU>

输入HELP命令可以查看ODU支持的命令列表:

ODU> help
help      ----   get command list
exit      ----   exit from odu
spool     ----   spool information to file
host      ----   enter os terminal
load config ----   load config information from file
open      ----   load database filename list from file
osdump    ----   dump file format hex
dump      ----   dump oracle datafile block
rowid     ----   decode rowid components
unload    ----   unload data
list      ----   list schema object,partition,datafile
charset   ----   get or list supported charset name

输入命令unload table test.t1,即可导出TEST用户下的T1表:

ODU> unload table test.t1

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

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

TEST_T1.ctl
TEST_T1.sql
TEST_T1.txt

TEST_T1.ctl是用于sqlldr装入数据所需要的控制文件,TEST_T1.sql是建表SQL脚本,TEST_T1.txt是导出的数据。
我们可以用sql文件建表,然后使用sqlldr装入数据。
--EOF

,
Trackback

69 comments untill now

  1. 感谢老熊!祝越做越好!

    [回复]

  2. 谢谢小荷的支持

    [回复]

  3. 好工具啊,会有文件大小的限制吗?

    [回复]

  4. to xueji03:
    没有文件大小限制,并支持64位IO

    [回复]

  5. 好工具,支持。。。

    [回复]

  6. 好东西,谢谢老熊!

    [回复]

  7. 能做成GUI界面就好了。

    [回复]

  8. 如果不是数据文件,是RAW或ASM可以用吗?

    [回复]

    老熊 回复:

    RAW是完全没有问题的。
    ASM不支持,但是如果ASM是好的,可以把文件从ASM中拷出来,比如asmcmd,rman之类的,然后再用ODU做恢复。

    [回复]

  9. 谢谢老熊回复,此工具很好很强大,工具收藏了。但愿永远也用不到。

    [回复]

    老熊 回复:

    是的,备份才是保证数据完全的最好手段。

    [回复]

  10. 怎么样导出一个用户下的所有表?

    [回复]

    老熊 回复:

    unload user 即可。

    [回复]

  11. brucewoo @ 2009-05-15 09:12

    倒出含有Blob类型的数据时,
    在data目录下,生成几个以
    blob打头的子目录,这几个
    目录对属主来说只有读权限
    (read).缺省情况下都无法
    访问.不知道这种情况是否正
    常.

    [回复]

    老熊 回复:

    看看执行odu程序的用户,profile中umask是如何设置的?你手工建个目录是什么权限?目录有rx权限就可以访问目录内的文件。

    [回复]

  12. brucewoo @ 2009-05-15 12:20

    手工建立的目录是有rx权限的.生成
    的文件也是有rx权限的.就是那几个
    和blob相关的目录有些奇怪. OS是
    linux.

    [回复]

  13. 那文件能访问到吗?在BLOG上讨论不是很方便,可以加我的QQ进行讨论。

    [回复]

  14. brucewoo @ 2009-05-15 13:18

    加MSN可以不

    [回复]

  15. brucewoo @ 2009-05-15 13:25

    需要使用chmod命令重新设置权限后才可以

    [回复]

    老熊 回复:

    没问题

    [回复]

  16. brucewoo @ 2009-05-15 18:47

    已经在MSN上加你了,希望在不忙的时候给个回答.

    [回复]

    老熊 回复:

    将参数文件config.txt中output_format设置为dmp,然后重新载入配置或重新进入odu即可。

    [回复]

  17. imbright @ 2009-05-18 08:07

    如果只有一个数据文件,没有system表空间文件,是不是用unload object能到处数据文件中的表数据?
    data_object_id如何获得呢?

    [回复]

    老熊 回复:

    首先得scan extent,就是扫描数据文件,然后需要使用unload object all sample来自动识别文件中的数据,接下来找到data/sample.txt文件,从里面找到你需要的数据,同时附带有自动生成的命令,最后执行这个命令就可以了。

    [回复]

  18. 轻轻松松 @ 2009-06-04 09:22

    你好!
    运行odu后,我怎么得不到有关数据库文件的信息。也就是 control.txt 是空的?在 odu 中,用 open 命令得到的返回的信息也是空的。是我的设置不对吗? 我的 平台是: linux x86 & oracle 10g(10.2.0.3)

    [回复]

  19. 你需要手工在control.txt中填入数据文件信息,具体可参见http://www.laoxiong.net/odu_command_explain_part1.html

    [回复]

  20. 轻轻松松 @ 2009-06-05 11:12

    谢谢老熊。知道了 只要填上有关数据文件的前四项信息就可。已经可以进展下去了。再次表示感谢!

    [回复]

  21. 支持老熊。虽然我也是老兄

    [回复]

  22. 支持下老熊,我朋友有个库是noarchivelog的,system坏了,现在也在用odu,已经做到把数据字典生成了,有个问题,怎么查看有哪些表

    [回复]

    老熊 回复:

    @鑫, 使用list table 即可显示某个用户下的所有表。
    list user可以列出所有用户

    [回复]

  23. flybuffer @ 2009-07-30 15:52

    呵呵 终于发现一个免费的 无功能限制的dul 十分感谢楼主的宽广的胸怀和技术分享

    [回复]

  24. 支持西欧WE8ISO8859P1字符集吗?

    [回复]

  25. 我打开或者重新open时,出现unknown file format 请问是为什么?

    [回复]

  26. dbf文件使用dbv验证程序出错,还能恢复吗?

    [回复]

    老熊 回复:

    @john, dbv验证出错,也是可以的。
    出现unknown file format,表明数据文件格式不能识别。是不是相应的参数没有设置正确?比如byte_order等。另外有些操作系统的裸设备是有偏移的,比如低版本的AIX上,lv有4k的偏移。
    支持西欧WE8ISO8859P1字符集

    [回复]

  27. to 老熊:
    谢谢您的回复!使用dbv验证出错的dbf文件也是一样的处理吗?unknown file format出现的环境是 我的oracle生产时是在linux,我提取数据的环境在windows ,另外我的版本是3.0.7,使用charset list查看不支持西欧字符集

    [回复]

    老熊 回复:

    @john, 如果你的数据库中存储有中文,那么使用ZHS16GBK也是一样的。ODU需要的是实际的字符集,而不是数据库本身的字符集(虽然二者在绝大多数情况下是一样的)

    [回复]

  28. to 老熊:
    我的环境是这样:使用dbv检查system和用户表空间都是严重损坏,然后我将此两文件搬到windows下,数据块是8192字节,表空间全部是smallfile格式,原来字符集是西欧,昨天试着用unload table sys发现导出的数据文件(txt)大多是0字节,只有少许有数据

    [回复]

    老熊 回复:

    @john, 首先要看数据字典是不是能正常导出,也就是unload dict命令是否正常。怀疑SYSTEM表空间损毁比较严重。

    [回复]

  29. 今天测试了下工具,我导出了数据,就是clob数据没有。
    数据文件内容: 1|aaa|
    2|bbb|
    3|ccc|

    我的表结构有三列,id,name,remark。remark(clob)在数据文件中为空。。。

    [回复]

    老熊 回复:

    @kadeem, CLOB数据的表空间的数据文件是否在control.txt文件中指定?lob_storage参数设置的是什么?是不是设置的file还是其他值。

    [回复]

  30. 你好,我这边设置的参数lob_storage=file

    以下是运行的结果:
    ODU> unload table hb.c_text

    Unloading table: C_TEXT,object ID: 62432
    can not create lob data dir:lob\lob62433_0003
    Unloading segment,storage(Obj#=62432 DataObj#=62432 TS#=4 File#=4 Block#=1259 Cl
    uster=0)
    3 rows unloaded

    [回复]

  31. can not create lob data dir:lob\lob62433_0003
    这里表明不能创建lob\lob62433_0003这个目录来保存lob数据。
    你的odu目录下没有lob这个目录,需要手工建立。最好是config.txt中lob_path指定为一个绝对路径。比如/odu/data/lob,然后在/odu/data/建个目录lob

    [回复]

  32. 我这边把config.txt:
    lob_storage设置为 infile
    clob_byte_order设置为 big

    这样clob数据就可以显示了。
    谢谢!。

    准备在测试下blob数据,呵呵

    [回复]

    老熊 回复:

    @kadeem, 设为infile,这样虽然能够显示,但是不容易导入。

    [回复]

  33. 导入数据也测试成功(dmp格式),不过blob 导出由问题
    ODU> unload table angel.bm_loc_bmp

    Unloading table: BM_LOC_BMP,object ID: 62329
    Unloading segment,storage(Obj#=62329 DataObj#=62329 TS#=7 File#=6 Block#=419075
    Cluster=0)
    0 rows unloaded

    ODU> desc angel.bm_loc_bmp

    Object ID:62329
    Storage(Obj#=62329 DataObj#=62329 TS#=7 File#=6 Block#=419075 Cluster=0)

    NO. SEG INT Column Name Null? Type

    — — — —————————— ——— —————————

    1 1 1 OID NOT NULL VARCHAR2(50)

    2 2 2 NAME NOT NULL VARCHAR2(300)

    3 3 3 REMARK VARCHAR2(400)

    4 4 4 BMP BLOB

    ODU>

    导出blob数据需要怎样配置呢?

    [回复]

    老熊 回复:

    @kadeem, 只要lob_storage不是none就可以
    有什么问题在QQ上讨论一下,这里不是很方便讨论。

    [回复]

  34. 请问老熊,这是什么问题:
    [oracle@devpbk odu 14:37 ]$ ./odu

    Oracle Data Unloader:Release 3.0.8

    Copyright (c) 2008,2009 XiongJun. All rights reserved.

    Web: http://www.laoxiong.net
    Email: magic007cn@gmail.com

    loading default config…….

    byte_order little
    block_size 16384
    db_timezone -7
    client_timezone 8
    data_path data
    charset_name ZHS16GBK
    ncharset_name AL16UTF16
    output_format text
    lob_storage infile
    clob_byte_order little

    load control file ‘config.txt’ successful
    loading default control file ……

    unknown file format ‘/oracle/app/oracle/oradata/devp/system01.dbf’
    unknown file format ‘/oracle/app/oracle/oradata/devp/sysaux01.dbf’
    unknown file format ‘/oracle/app/oracle/oradata/devp/undotbs01.dbf’
    unknown file format ‘/oracle/app/oracle/oradata/devp/users01.dbf’
    unknown file format ‘/oracle/app/oracle/oradata/devp/test_data01.dbf’

    ts# fn rfn bsize blocks bf offset filename
    —- —- —- —– ——– — —— ——————————————–
    0 1 1 16384 0 N 0 /oracle/app/oracle/oradata/devp/system01.dbf
    1 2 2 16384 0 N 0 /oracle/app/oracle/oradata/devp/sysaux01.dbf
    2 3 3 16384 0 N 0 /oracle/app/oracle/oradata/devp/undotbs01.dbf
    4 4 4 16384 0 N 0 /oracle/app/oracle/oradata/devp/users01.dbf
    6 5 5 16384 0 N 0 /oracle/app/oracle/oradata/devp/test_data01.dbf
    load control file ‘control.txt’ successful
    loading dictionary data……

    [回复]

  35. 它总是报unknown file format

    [回复]

  36. ODU> unload dict
    file ‘ 0x0.0000c08f9f514p-1022s not valid file header or block format
    can not get bootstrap$ address from SYSTEM tablespace

    [回复]

  37. ODU> open
    unknown file format ‘/oracle/app/oracle/oradata/devp/system01.dbf’
    unknown file format ‘/oracle/app/oracle/oradata/devp/sysaux01.dbf’
    unknown file format ‘/oracle/app/oracle/oradata/devp/undotbs01.dbf’
    unknown file format ‘/oracle/app/oracle/oradata/devp/users01.dbf’
    unknown file format ‘/oracle/app/oracle/oradata/devp/test_data01.dbf’

    ts# fn rfn bsize blocks bf offset filename
    —- —- —- —– ——– — —— ——————————————–
    0 1 1 16384 0 N 0 /oracle/app/oracle/oradata/devp/system01.dbf
    1 2 2 16384 0 N 0 /oracle/app/oracle/oradata/devp/sysaux01.dbf
    2 3 3 16384 0 N 0 /oracle/app/oracle/oradata/devp/undotbs01.dbf
    4 4 4 16384 0 N 0 /oracle/app/oracle/oradata/devp/users01.dbf
    6 5 5 16384 0 N 0 /oracle/app/oracle/oradata/devp/test_data01.dbf
    load control file ‘control.txt’ successful

    [回复]

  38. 请问老熊,我下载的是odu_309_win32.zip并且解压到D盘,然后点击odu.exe文件,为何没出现ts# fn rfn bsize blocks bf filename没有记录。谢谢。

    [回复]

  39. 请问老熊,为什么我执行unload table test.t1,提示表不存在.该表实际是存在的并且用户也是存在的。

    [回复]

    老熊 回复:

    @xiaoxu, 请确认一下control.txt配置正确,在unload table之前请确认能够正常unload dict

    [回复]

  40. load control file ‘control.txt’ successful
    loading dictionary data……

    ODU> unload dict
    file ” has not valid file header or block format
    can not get bootstrap$ address from SYSTEM tablespace

    这个是什么意思啊。

    [回复]

  41. 要是有源码可以研究下就更好了,呵呵……

    [回复]

  42. 为什么我的解压到D盘后,执行不了
    D:\odu>odu.exe

    Oracle Data Unloader:Release 3.0.9

    Copyright (c) 2008,2009 XiongJun. All rights reserved.

    Web: http://www.laoxiong.net
    Email: magic007cn@gmail.com

    loading default config…….

    byte_order little
    block_size 8192
    data_path data
    lob_path lob
    charset_name ZHS16GBK
    ncharset_name AL16UTF16
    output_format text
    lob_storage file
    clob_byte_order little
    trace_level 1
    delimiter |

    load control file ‘config.txt’ successful
    loading default control file ……

    ts# fn rfn bsize blocks bf offset filename
    —- —- —- —– ——– — —— —————————————
    —-
    load control file ‘control.txt’ successful
    loading dictionary data……

    ODU> unload dict
    please run open command before unloading dict
    ODU>

    请老熊看一下。。

    [回复]

    老熊 回复:

    @fl, 那是你的control.txt文件还没有配置好。

    [回复]

  43. 不好意思,我自已添加好了,谢谢。

    [回复]

  44. lottery009 @ 2010-09-10 19:08

    老熊你好:
    我从你的网站下了个solaris版本的 ODU,但是运行时报错,请问是否版本原因,还是哪里没有配置好
    oracle@uacdb1$ odu
    -bash: ./odu: Invalid argument
    oracle@uacdb1$ ./odu
    -bash: ./odu: Invalid argument
    oracle@uacdb1$ uname -a
    SunOS uacdb1 5.10 Generic_138888-08 sun4u sparc SUNW,SPARC-Enterprise

    [回复]

    老熊 回复:

    @lottery009, 目前没有SPARC平台的版本。

    [回复]

  45. “急”:control.txt文件配的时候有什么规则吗;为何我unload dict后 老是报file ” has not valid file header or block format
    can not get bootstrap$ address from SYSTEM tablespace
    ,咋处理啊?

    [回复]

    老熊 回复:

    @小韦, control.txt的格式,请参考http://www.laoxiong.net/odu下其他的文章。

    [回复]

  46. 好的,谢谢

    [回复]

  47. 我的具体情况是:我在PL/SQL里面建立表完后,直接选中表右键drop。不是用语句执行的;(oracle9i)我试了一下,drop完后直接把表空间offline,然后按你这块的具体执行流程操作,都没有什么异常,但在用ODU的时候结果是“no data”;找半天没找着为咋;
    我执行:select scn,timestamp,sql_redo from v$logmnr_contents where timestamp>to_date(‘2010-12-08 14:11:11′,’yyyy-mm-dd hh24:mi:ss’) order by 1;

    显示如下:
    27135726 2010-12-8 下 commit;
    27135730 2010-12-8 下 set transaction read write;
    27135730 2010-12-8 下 drop table WMH3
    ;

    27135730 2010-12-8 下 Unsupported
    27135730 2010-12-8 下
    27135730 2010-12-8 下
    27135730 2010-12-8 下
    27135731 2010-12-8 下 Unsupported

    SCN TIMESTAMP SQL_REDO
    ———- ———– ——————————————————————————–
    27135731 2010-12-8 下
    27135731 2010-12-8 下
    27135731 2010-12-8 下
    27135731 2010-12-8 下 Unsupported
    27135731 2010-12-8 下
    27135731 2010-12-8 下
    27135731 2010-12-8 下
    27135731 2010-12-8 下 Unsupported
    27135732 2010-12-8 下 Unsupported
    27135734 2010-12-8 下 delete from “SYS”.”OBJ$” where “OBJ#” = ‘45956’ and “DATAOBJ#” = ‘45956’ and “OW

    但在ODU中执行 “unload object 45956 sample” 后显示
    Sample result:
    object id: 45956
    no data.

    ╮(╯▽╰)╭

    [回复]

  48. 夜半歌声 @ 2010-12-20 01:24

    我看到你说ODU可以恢复没有SYSTEM表空间的数据文件,只要先scan extent,就是扫描数据文件,然后使用unload object all sample来自动识别文件中的数据,就能得到SAMPLE.txt,但是我unload object all sample 后什么文件都没有得到,想请教一下是怎么回事啊?

    [回复]

  49. 为什么我在导出表的时候 ,表里有14条数据,只能导出一条数据.
    是不是什么地方设置的不正确?

    [回复]

    老熊 回复:

    如果是用的试用版,就只能导出部分数据。

    [回复]

  50. 怎么购买呀?

    [回复]

Add your comment now