ODU命令详解 PartII

接上文《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>

此命令格式用于导出一个用户下的所有表。此命令在有数据字典时才支持。这样简化了导出一个用户下所有的表的操作。

,
Trackback

9 comments untill now

  1. […] 接上文《ODU命令详解 PartII》,本文继续介绍ODU的命令 […]

  2. Hi laoxiong,
    对于 unload object 命令,如果没有system表空间文件也不知道表的各列类型,还有办法把数据导出来吗?

    老熊 Reply:

    @arden, 在这种情况下,你只有先scan extent,然后unload object all sample,由ODU来自动判断数据类型,然后你可以在输出的sample文件中找到需要的数据及命令。

  3. thx

    我去试试看

  4. Hi laoxiong,

    按照你的建议,已经成功导出了一些数据,灰常感谢。

    还有一个问题,有些数据文件,我在做完 scan extent 操作后,发现ext.odu 文件里面有数据,但是 segment.txt 却是空记录。
    然后 unload object all sample 命令就不起作用了。有什么办法吗?可以自己造一个segment.txt吗?

    谢谢。

  5. 更好的办法可能是把所有的数据文件一起进行 scan extent, 一起导出。上一个问题是由于有一个table太大了,存在于两个文件中,其中一个unload了一些数据,另外一个做完scan extent的时候就不干活了。

    老熊 Reply:

    @arden, 实际上scan extent的时候至少要scan完整的表空间。因为scan extent会覆盖上一次scan的结果。

  6. mfkqwyc86 @ 2011-02-18 15:26

    5) unload user

    此命令格式用于导出一个用户下的所有表。此命令在有数据字典时才支持。这样简化了导出一个用户下所有的表的操作。

    熊老师,这个命令在导出表为DMP格式时,如果这个user下有多个table,就会存在多个dmp文件,即一个表为一个dmp,不便于imp的恢复,可以不可能把user下的表导出时多张表都放在一个dmp文件中?

    老熊 Reply:

    谢谢你的建议,目前可以使用脚本很方便地导入多个文件。同时多文件多表可以并行导入,提高导入的性能。

Add your comment now