Oraccle9i除支持FULL、TABLES和OWNER三种传统方式的export/import外,还支持Tablespaces方式(Tablespaces和Transport Tablespaces)的export/import,对于TABLES方式,Oracle9i中增加了Query方式的export/import,对于前而三种方式我们以前应用较多,不再进行过多的描述,本文主要讨论Query、Tablespaces及Transport Tablespaces方式在数据迁移中的应用。
1、 Query方式
Query参数是Table方式的一种补充,它的主要作用是将表中的一个子集export出来进行迁移,如,我们要迁移所有未处理完成的工单时,可以用该参数:
Exp icdmain/icd file=exp_serviceinfo.dmp tables=serviceinfo query=\” where disposalcursorflag \< 6\”
其中:\为操作系统转义符,避免操作系统处理命令进中的特殊字符;Query参数为一个where子句,对于多个表时,必须保证该子句适用于每一个表,而不是多个表做连接;若未指定其它参数,export的表将包含索引、约束。
在目标数据库中,可以用:
imp icdmain/icd file=exp_serviceinfo.dmp tables=serviceinfo
进行表结构及数据的导入。
注意:
(1)Query参数不能用于full、user和tablespaces方式的export。
(2)Query参数不能使用direct path的export,即使用了Query参数就不能用direct=y参数。
2、 Tablespaces方式
Tablespaces方式主要用于整个表空间,是将整个表空间中的表结构、数据进行导出,如将ICD_BILLLOG1空间中的数据进行导出,可以用该方式:
Exp icd/icd file=exp_icd_billlog1.dmp tablespaces=ICD_BILLLOG1
其中,tablespaces指定需要使出的表空间名称,可以指定多个表空间进行导出,以上命令会将ICD_BILLLOG1表空间的表结构、数据进行导出,若给出其它参数,表空间中所有表的索引、约束也将包含在导出文件中,无论索引数据是否存储在该表空间。
在进行import前,需要保证目的表空间、索引表空间已存在,如上例中,表T_BILLLOG1存储在ICD_BILLLOG1表空间中,而其索引存储在ICD_BILLLOG_IND表空间中,那么,我们需要保证ICD_BILLLOG1、ICD_BILLLOG_IND两个表空间在目的数据库中已经建立,否则索引将导入失败,需要手工进行重建。
Import的命令格式如下:
Imp icd/icd file=exp_icd_billlog1.dmp tablespaces=ICD_BILLLOG1 fromuser=icd touser=icd
注意:要使用tablespaces方式导出的用户必须具有EXP_FULL_DATABASE角色权限。
3、 Transport Tablespaces方式
Transport Tablespaces方式主要用于数据的快速迁移,其原理就是数据文件的复制和数据字典的迁移,因为只要对数据文件进行复制,而不用创建数据文件及import大量数据,因此其速度比以往的方式都要快。
一般迁移的步骤为:
(1)将需要迁移的表空间置为read only状态;
(2)将数据文件复制到目的路径,文件使用FTP,裸设备用dd和FTP命令进行复制。
(3)在源数据库侧做数据字典的export;
(4)在目的数据库侧做数据字典的import;
例如:源数据库DB1上ICDMAIN用户有SERVICE_MAIN_DAT、SERVICE_MAIN_IDX、SERVICE_LOG_DAT、SERVICE_LOG_IDX、SERVICE_HIST_DAT、SERVICE_HIST_IDX六个表空间,我们要将它们全部到DB2上,则可以用以下方法进行:
(1) 用使用alter tablespace SERVICE_MAIN_DAT read only;命令将各表空间置为read only状态。
(2) 复制数据库文件,对于文件系统,直接将数据文件FTP到DB2相应路径,对于裸设备,使用命令:dd if=/dev/rlv_data10 f=/data/data10进行数据复制。
这样,裸设备数据将存储在data10文件中,然后将data10文件FTP到DB2的相应路径,使用命令:dd if=/data/data10 f=/dev/rlv_data20进行数据恢复。
其中rlv_data20为DB2上的一个空闲裸设备,空间大小与DB1上的rlv_data10完全一样。
(3) 在DB1上做export:
exp \"sys\/sys as sysdba\" file=exp_service_main_dat.dmp tablespaces= SERVICE_MAIN_DAT transport_tablespace=y tts_owners=icd
其中tts_owners是所有在导出表空间中有属主表的用户。
将各表空间导出后,用FTP或其它方式将文件传送到DB2。
(4)在DB2上做import:
imp \"sys\/sys as sysdba\" file=exp_service_main_dat.dmp tablespaces= SERVICE_MAIN_DAT transport_tablespace=y datafiles=/dev/rdata20 tts_owners=icd
若datafiles有多个,设备名之间由逗号分隔。
(5)最后,将源数据库、目的数据库中的表空间状态置为read write:
alter tablespace SERVICE_MAIN_DAT read write;
以上几种方法是在Oracle9i间进行数据迁移。若与其它版本进行数据库迁移,则建议仍使用传统的三种exp方式,并注意不同版本间的imp/exp的兼容关系。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26775086/viewspace-730339/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26775086/viewspace-730339/