ORACLE数据迁移

来源:互联网 发布:美画人生淘宝店 编辑:程序博客网 时间:2024/04/30 12:36

Oraccle9i除支持FULLTABLESOWNER三种传统方式的export/import外,还支持Tablespaces方式(TablespacesTransport Tablespaces)的export/import,对于TABLES方式,Oracle9i中增加了Query方式的export/import,对于前而三种方式我们以前应用较多,不再进行过多的描述,本文主要讨论QueryTablespacesTransport 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

进行表结构及数据的导入。

注意:

1Query参数不能用于fullusertablespaces方式的export

2Query参数不能使用direct pathexport,即使用了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_BILLLOG1ICD_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,裸设备用ddFTP命令进行复制。

(3)在源数据库侧做数据字典的export

(4)在目的数据库侧做数据字典的import

例如:源数据库DB1ICDMAIN用户有SERVICE_MAIN_DATSERVICE_MAIN_IDXSERVICE_LOG_DATSERVICE_LOG_IDXSERVICE_HIST_DATSERVICE_HIST_IDX六个表空间,我们要将它们全部到DB2上,则可以用以下方法进行:

(1) 用使用alter tablespace SERVICE_MAIN_DAT read only;命令将各表空间置为read only状态。

(2) 复制数据库文件,对于文件系统,直接将数据文件FTPDB2相应路径,对于裸设备,使用命令:dd if=/dev/rlv_data10 of=/data/data10进行数据复制。

这样,裸设备数据将存储在data10文件中,然后将data10文件FTPDB2的相应路径,使用命令:dd if=/data/data10 of=/dev/rlv_data20进行数据恢复。

其中rlv_data20DB2上的一个空闲裸设备,空间大小与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的兼容关系。

原创粉丝点击