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表空间文件也不知道表的各列类型,还有办法把数据导出来吗?

    [回复]

    老熊 回复:

    @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的时候就不干活了。

    [回复]

    老熊 回复:

    @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文件中?

    [回复]

    老熊 回复:

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

    [回复]

Add your comment now