ODU快速上手
ODUmanual ODU2月 8th, 2009本文将以ODU 2.1.0 for Windows版,介绍如何使用ODU。本文只是一个快速上手指南,以后将详细介绍ODU的使用。
在本网站下载到ODU的Windows版本,是一个ZIP压缩文件,解压缩到一个目录,比如解压到d:\,将会看到d:\odu目录下有如下的文件和目录:
D:\odu>dir
驱动器 D 中的卷没有标签。
卷的序列号是 045E-00DED:\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.comloading 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

2月 9th, 2009 at 9:46 上午
感谢老熊!祝越做越好!
2月 9th, 2009 at 9:54 上午
谢谢小荷的支持
2月 9th, 2009 at 10:12 上午
好工具啊,会有文件大小的限制吗?
2月 9th, 2009 at 10:44 上午
to xueji03:
没有文件大小限制,并支持64位IO
2月 9th, 2009 at 10:48 上午
好工具,支持。。。
2月 12th, 2009 at 1:11 下午
好东西,谢谢老熊!
2月 18th, 2009 at 4:39 下午
能做成GUI界面就好了。
4月 28th, 2009 at 5:54 下午
如果不是数据文件,是RAW或ASM可以用吗?
老熊 Reply:
4月 28th, 2009 at 6:18 下午
RAW是完全没有问题的。
ASM不支持,但是如果ASM是好的,可以把文件从ASM中拷出来,比如asmcmd,rman之类的,然后再用ODU做恢复。
4月 29th, 2009 at 2:11 下午
谢谢老熊回复,此工具很好很强大,工具收藏了。但愿永远也用不到。
老熊 Reply:
4月 29th, 2009 at 6:42 下午
是的,备份才是保证数据完全的最好手段。
5月 5th, 2009 at 10:49 下午
怎么样导出一个用户下的所有表?
老熊 Reply:
5月 5th, 2009 at 11:41 下午
unload user 即可。
5月 15th, 2009 at 9:12 上午
倒出含有Blob类型的数据时,
在data目录下,生成几个以
blob打头的子目录,这几个
目录对属主来说只有读权限
(read).缺省情况下都无法
访问.不知道这种情况是否正
常.
老熊 Reply:
5月 15th, 2009 at 9:58 上午
看看执行odu程序的用户,profile中umask是如何设置的?你手工建个目录是什么权限?目录有rx权限就可以访问目录内的文件。
5月 15th, 2009 at 12:20 下午
手工建立的目录是有rx权限的.生成
的文件也是有rx权限的.就是那几个
和blob相关的目录有些奇怪. OS是
linux.
5月 15th, 2009 at 1:05 下午
那文件能访问到吗?在BLOG上讨论不是很方便,可以加我的QQ进行讨论。
5月 15th, 2009 at 1:18 下午
加MSN可以不
5月 15th, 2009 at 1:25 下午
需要使用chmod命令重新设置权限后才可以
老熊 Reply:
5月 15th, 2009 at 2:06 下午
没问题
5月 15th, 2009 at 6:47 下午
已经在MSN上加你了,希望在不忙的时候给个回答.
老熊 Reply:
5月 15th, 2009 at 7:42 下午
将参数文件config.txt中output_format设置为dmp,然后重新载入配置或重新进入odu即可。
5月 18th, 2009 at 8:07 上午
如果只有一个数据文件,没有system表空间文件,是不是用unload object能到处数据文件中的表数据?
data_object_id如何获得呢?
老熊 Reply:
5月 18th, 2009 at 9:13 上午
首先得scan extent,就是扫描数据文件,然后需要使用unload object all sample来自动识别文件中的数据,接下来找到data/sample.txt文件,从里面找到你需要的数据,同时附带有自动生成的命令,最后执行这个命令就可以了。
6月 4th, 2009 at 9:22 上午
你好!
运行odu后,我怎么得不到有关数据库文件的信息。也就是 control.txt 是空的?在 odu 中,用 open 命令得到的返回的信息也是空的。是我的设置不对吗? 我的 平台是: linux x86 & oracle 10g(10.2.0.3)
6月 4th, 2009 at 9:55 上午
你需要手工在control.txt中填入数据文件信息,具体可参见http://www.laoxiong.net/odu_command_explain_part1.html
6月 5th, 2009 at 11:12 上午
谢谢老熊。知道了 只要填上有关数据文件的前四项信息就可。已经可以进展下去了。再次表示感谢!
7月 16th, 2009 at 9:29 上午
支持老熊。虽然我也是老兄
7月 28th, 2009 at 2:51 下午
支持下老熊,我朋友有个库是noarchivelog的,system坏了,现在也在用odu,已经做到把数据字典生成了,有个问题,怎么查看有哪些表
老熊 Reply:
7月 28th, 2009 at 6:43 下午
@鑫, 使用list table即可显示某个用户下的所有表。
list user可以列出所有用户
7月 30th, 2009 at 3:52 下午
呵呵 终于发现一个免费的 无功能限制的dul 十分感谢楼主的宽广的胸怀和技术分享
9月 9th, 2009 at 2:22 上午
支持西欧WE8ISO8859P1字符集吗?
9月 9th, 2009 at 2:48 上午
我打开或者重新open时,出现unknown file format 请问是为什么?
9月 9th, 2009 at 3:19 上午
dbf文件使用dbv验证程序出错,还能恢复吗?
老熊 Reply:
9月 9th, 2009 at 11:13 上午
@john, dbv验证出错,也是可以的。
出现unknown file format,表明数据文件格式不能识别。是不是相应的参数没有设置正确?比如byte_order等。另外有些操作系统的裸设备是有偏移的,比如低版本的AIX上,lv有4k的偏移。
支持西欧WE8ISO8859P1字符集
9月 9th, 2009 at 4:07 下午
to 老熊:
谢谢您的回复!使用dbv验证出错的dbf文件也是一样的处理吗?unknown file format出现的环境是 我的oracle生产时是在linux,我提取数据的环境在windows ,另外我的版本是3.0.7,使用charset list查看不支持西欧字符集
老熊 Reply:
9月 13th, 2009 at 6:34 上午
@john, 如果你的数据库中存储有中文,那么使用ZHS16GBK也是一样的。ODU需要的是实际的字符集,而不是数据库本身的字符集(虽然二者在绝大多数情况下是一样的)
9月 9th, 2009 at 4:23 下午
to 老熊:
我的环境是这样:使用dbv检查system和用户表空间都是严重损坏,然后我将此两文件搬到windows下,数据块是8192字节,表空间全部是smallfile格式,原来字符集是西欧,昨天试着用unload table sys发现导出的数据文件(txt)大多是0字节,只有少许有数据
老熊 Reply:
9月 13th, 2009 at 6:35 上午
@john, 首先要看数据字典是不是能正常导出,也就是unload dict命令是否正常。怀疑SYSTEM表空间损毁比较严重。
9月 10th, 2009 at 3:35 下午
今天测试了下工具,我导出了数据,就是clob数据没有。
数据文件内容: 1|aaa|
2|bbb|
3|ccc|
我的表结构有三列,id,name,remark。remark(clob)在数据文件中为空。。。
老熊 Reply:
9月 13th, 2009 at 6:36 上午
@kadeem, CLOB数据的表空间的数据文件是否在control.txt文件中指定?lob_storage参数设置的是什么?是不是设置的file还是其他值。
9月 14th, 2009 at 5:11 下午
你好,我这边设置的参数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
9月 14th, 2009 at 5:54 下午
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
9月 15th, 2009 at 9:25 上午
我这边把config.txt:
lob_storage设置为 infile
clob_byte_order设置为 big
这样clob数据就可以显示了。
谢谢!。
准备在测试下blob数据,呵呵
老熊 Reply:
9月 15th, 2009 at 9:57 上午
@kadeem, 设为infile,这样虽然能够显示,但是不容易导入。
9月 15th, 2009 at 10:09 上午
导入数据也测试成功(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数据需要怎样配置呢?
老熊 Reply:
9月 15th, 2009 at 10:16 上午
@kadeem, 只要lob_storage不是none就可以
有什么问题在QQ上讨论一下,这里不是很方便讨论。
12月 3rd, 2009 at 2:44 下午
请问老熊,这是什么问题:
[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……
12月 3rd, 2009 at 2:44 下午
它总是报unknown file format
12月 3rd, 2009 at 3:07 下午
ODU> unload dict
file ‘ 0×0.0000c08f9f514p-1022s not valid file header or block format
can not get bootstrap$ address from SYSTEM tablespace
12月 3rd, 2009 at 3:19 下午
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
1月 8th, 2010 at 10:23 上午
请问老熊,我下载的是odu_309_win32.zip并且解压到D盘,然后点击odu.exe文件,为何没出现ts# fn rfn bsize blocks bf filename没有记录。谢谢。
1月 8th, 2010 at 10:44 上午
请问老熊,为什么我执行unload table test.t1,提示表不存在.该表实际是存在的并且用户也是存在的。
老熊 Reply:
1月 8th, 2010 at 11:22 上午
@xiaoxu, 请确认一下control.txt配置正确,在unload table之前请确认能够正常unload dict
1月 29th, 2010 at 3:23 下午
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
这个是什么意思啊。