接上文《ODU命令详解 PartI》,本文继续介绍ODU的命令
4.unload 命令
unload命令是ODU中命令格式最复杂的命令,但也是最关键的命令。命令的格式如下:
unload dict
unload table <schema.tablename> [partition <partition_name>]
unload table <schema.tablename> object <data_obj_id> [tablespace <ts_no>]
unload object <data_obj_id> [cluster <cluster_no>] [tablespace <ts_no>] column <type[,type,type......]>
type: VARCHAR2 VARCHAR CHAR NUMBER SKIP LONG RAW
DATE LONGRAW TIMESTAMP TIMESTAMPTZ TIMESTAMPLTZ
BINARY_FLOAT BINARY_DOUBLE
unload user <schema name>
1) unload dict
unload dict用于从SYSTEM表空间解析数据字典,并将ODU所需要的数据字典数据保存到user.odu,tab.odu,obj.odu,col.odu,ind.odu等文件中。这样,ODU就可以利用数据字典信息UNLOAD数据。对于在有数据字典的情况下,ODU的功能能够得到最大程度地发挥:全面支持IOT表,全面支持LOB类型。
ODU> unload dict
get_bootstrap_dba: compat header size:12
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并不是从文件号为1的数据文件中得到bootstrap地址进而得到数据字典,而是从control.txt的第一行中得到bootstrap地址。所以,需要将SYSTEM表空间中的第1个数据文件放置于control.txt中的第1行。否则会得到如下的错误:
can not get bootstrap$ address from SYSTEM tablespace
得到数据字典后,你可以使用list user, list table等命令查看数据库中的用户及用户下的表、视图等对象。
2) unload table <schema .tablename> [partition <partition_name>]
这个命令格式用于导出某个用户下的表,如果指定了partition,则只导出分区表中的那个分区。例如:
ODU> unload table sys.t1
Unloading table: T1,object ID: 31417
Unloading segment,storage(Obj#=31417 DataObj#=31418 TS#=0 File#=1 Block#=83041 Cluster=0)
导出表时,会显示表名,对象ID(Object ID),以及导出段的段头等信息。
使用此命令,表名要使用表的全限定名,则“用户名”+“表名“。
3) unload table <schema.tablename> object <data_obj_id> [tablespace <ts_no>]
此命令格式与上一命令格式的差别在于,在导出的表名之后指定了数据对象ID(data object id),这用于导出表其实际data object id与数据字典中表的data object id不一致时的表数据。简单点说,就是用于导出被truncate的表数据。导出前需要用SCAN命令扫描数据文件,导出truncate表的数据的详细操作,将另行撰文说明。
4) unload object <data_obj_id> [cluster <cluster_no>] [tablespace <ts_no>] column <type[,type,type......]>
这条命令简单点说,就是用于没有SYSTEM表空间或者没有数据字典时的数据导出,或用于导出被DROP了的表。
这条命令中,列类型为以下:
VARCHAR2 VARCHAR CHAR NUMBER SKIP LONG RAW
DATE LONGRAW TIMESTAMP TIMESTAMPTZ TIMESTAMPLTZ
BINARY_FLOAT BINARY_DOUBLE
SKIP表示不导出那个列。目前不支持没有数据字典(和SYSTEM表空间)时的IOT表和LOB类型的列。导出前需要用SCAN命令扫描数据文件。
此条命令和上条命令中,为啥可以指定TABLESPACE,这是因为在一个数据库中,data object id可能不是唯一的。比如,使用了表空间传输就可能会有这样的情况。
后面将专门有文章描述如何在没有数据字典时导出数据。这是一个比较复杂的过程,所以此处只是介绍一下命令,不再详述。
5) unload user <schema name>
此命令格式用于导出一个用户下的所有表。此命令在有数据字典时才支持。这样简化了导出一个用户下所有的表的操作。
[…] 接上文《ODU命令详解 PartII》,本文继续介绍ODU的命令 […]
Hi laoxiong,
对于 unload object 命令,如果没有system表空间文件也不知道表的各列类型,还有办法把数据导出来吗?
[回复]
老熊 回复:
11月 16th, 2010 at 2:54 下午
@arden, 在这种情况下,你只有先scan extent,然后unload object all sample,由ODU来自动判断数据类型,然后你可以在输出的sample文件中找到需要的数据及命令。
[回复]
thx
我去试试看
[回复]
Hi laoxiong,
按照你的建议,已经成功导出了一些数据,灰常感谢。
还有一个问题,有些数据文件,我在做完 scan extent 操作后,发现ext.odu 文件里面有数据,但是 segment.txt 却是空记录。
然后 unload object all sample 命令就不起作用了。有什么办法吗?可以自己造一个segment.txt吗?
谢谢。
[回复]
更好的办法可能是把所有的数据文件一起进行 scan extent, 一起导出。上一个问题是由于有一个table太大了,存在于两个文件中,其中一个unload了一些数据,另外一个做完scan extent的时候就不干活了。
[回复]
老熊 回复:
11月 19th, 2010 at 1:51 下午
@arden, 实际上scan extent的时候至少要scan完整的表空间。因为scan extent会覆盖上一次scan的结果。
[回复]
5) unload user
此命令格式用于导出一个用户下的所有表。此命令在有数据字典时才支持。这样简化了导出一个用户下所有的表的操作。
熊老师,这个命令在导出表为DMP格式时,如果这个user下有多个table,就会存在多个dmp文件,即一个表为一个dmp,不便于imp的恢复,可以不可能把user下的表导出时多张表都放在一个dmp文件中?
[回复]
老熊 回复:
2月 18th, 2011 at 3:45 下午
谢谢你的建议,目前可以使用脚本很方便地导入多个文件。同时多文件多表可以并行导入,提高导入的性能。
[回复]