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 of=/data/data10进行数据复制。 这样,裸设备数据将存储在data10文件中,然后将data10文件FTP到DB2的相应路径,使用命令:dd if=/data/data10 of=/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的兼容关系。 |