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