文本Tag:Oracle Oracle数据库管理
什么是ODU?
ODU全称为Oracle Database Unloader,是类似于Oracle的DUL的软件,用于直接从Oracle数据库的数据文件中获取表数据。在各种原因造成的数据库不能打开时,用于抢救数据,最大限度地减少数据丢失。
ODU有什么功能特点?
支持的Oracle数据库版本包括8i,9i,10g,11g
自动检测数据文件的表空间号和文件号
在有SYSTEM表空间的情况下,自动获取数据字典信息。
支持各种表,普通的HEAP表,IOT表,聚簇(CLUSTER)表。
DESC表,以显示表的列定义
支持10g及以上的大文件(BigFile)表空间
列出表的分区和子分区
支持表被truncate后的数据恢复
支持表被drop后的数据恢复
支持压缩表
支持在没有SYSTEM表空间和数据字典损坏的情况下恢复数据,在没有数据字典可用时,ODU能够自动判断数据的类型
支持IOT表导出:
普通IOT表的导出
压缩IOT表的导出
支持IOT表溢出段
支持IOT表分区(包括子分区)
只能在有SYSTEM表空间时才能导出IOT表
支持多种平台的数据库,包括AIX、LINUX、HPUX、SOLARIS、WINDOWS等。能够在一个平台上导出其他平台的数据,比如在Windows 32位系统上,使用AIX系统上的数据文件导出数据。
支持的数据类型包括:NUMBER, CHAR, VARCHAR2, NCHAR,NVARHCAR2, LONG, DATE, RAW, LONG RAW, BLOB, CLOB, TIMESTAMP (9i+) , BINARY FLOAT, BINARY DOUBLE (10g+)
导出的数据格式包括纯文本和DMP文件两种。以纯文本导出时,能够自动生成建表的SQL和SQLLDR导入所需的CONTROL文件(.CTL)
支持同一个库中不同的块大小的数据文件。
全面支持LOB字段:
支持CLOB、NCLOB和BLOB
CLOB支持Big Endian和Little Endian字节序
支持LOB分区,子分区
支持同一个表中,不同LOB列使用不同CHUNCK SIZE的情况
CLOB数据可以导出到与其他列相同的文件中,或存储到单独的文件中
LOB列只有在SYSTEM表空间存在的情况下才能导出
支持多种字符集之间的转换,能够正确的转换CLOB、NCLOB、NVARCHAR2列类型的数据到指定的字符集。
ODU全面支持64位系统,支持超过4G大小的数据文件。
支持复制操作系统命令不能复制的坏文件
模拟oracle的dump块功能,能够dump数据文件块的数据
目前不支持的功能:
11g的SecureFiles
ODU有什么使用限制吗?
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
2009-02-08 22:12
2009-02-08 01:16 218 config.txt
2009-02-08 01:16 99 control.txt
2009-02-08 22:12
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装入数据。
原文见老熊的网站:www.laoxiong.net