exp/expdp传输表空间和rman convert实现大数据量快速迁移

将Oracle数据库中某个用户迁移到另外一个库上,迁移的数据量大小约 120GB 。如果采用 expdp 导出的话时间会很长,再加上导出的 DMP 文件拷贝和 impdp 导入数据的时间,不能满足要求。 

这里采用 RMANCONVERT 功能和 exp/expdp 的transport_tablespace 的功能。前者将用户所在的表空间的数据文件从一个数据库所在的系统平台中拷贝到另外一个数据库系统上,后者将表空间对应的 metadata 数据拷贝出来。

测试过程虽然顺利,但最后想到一个问题, rman 中的 catalog 记录的 copy 的文件已经被数据库实例占用的情况下,该记录如何删除掉?

后来想到 rman convert 方法,它将文件系统文件拷贝到 ASM 磁盘组,不在 catalog 中留记录。同时,这个方法免去了文件名称修改的操作,更简洁高效。

使用 convert 可以实现跨平台的数据迁移,这点在环境复杂的项目中非常有用。

首先,介绍一下环境。

源库是 redhat linux as 5 ,单数据库实例,文件系统格式保存数据文件,数据库版本为 10.2.0.4 。

目标库是 redhat linux as 5 ,两节点的 RAC , ASM 格式保存数据文件,数据库版本为 10.2.0.4 。

可以使用 SELECT * FROMV$TRANSPORTABLE_PLATFORM; 检查这个版本上的表空间是否支持传输。结果当然是支持的。

其次,了解迁移的表空间和数据对象。

根据 dba_segments 查询到用户使用的哪些表空间,好决定要迁移的表空间。

在表空间确定了以后,如这里是 xxyy 。需要再根据表空间的 segment 都是哪些用户,如果不仅仅是要迁移的用户,还要将新的用户也找出来。

在目标库上提前将这些用户创建好。

这是因为我们采用的是表空间传输迁移数据,所以难免会有多的对象被迁移。根据实际情况权衡,决定是清理源头还是全部迁移。

表空间的 segment 的类型需要先分析一下。对于分区表、 IOT 表、 XMLType 对象等等不常见的,要先想想能不能用它迁移,这是第一点。

还有两点:一,目标库和源库的字符集要一致,否则请测试该方案;二、目标库不能有同名的表空间。

最后,开始正式迁移操作,步骤如下:

第一步,准备工作

校验表空间是否 self contained (注:不知道如何翻译,原文输出)

       SQL> execute sys.dbms_tts.transport_set_check('XXYY', true);

       SQL> select * from sys.transport_set_violations;

如果有记录,必须处理。

将表空间设置为只读状态。这点好理解,开始迁移了,就不能再写入数据到表空间了。

       SQL> ALTER TABLESPACE XXYY READ ONLY;

第二步,使用 exp 导出表空间所有对象的 metadata

exp userid=\'sys/sys as sysdba\' file=tbs_exp.dmp log=tba_exp.log   transport_tablespace=y   tablespaces=XXYY

 

第三步,使用 rman 的convert 将表空间的数据文件拷贝到文件系统上。

确定文件系统的平台名称

SQL> SELECT tp.platform_id,substr(d.PLATFORM_NAME,1,30), ENDIAN_FORMAT

 2       FROM V$TRANSPORTABLE_PLATFORM tp,V$DATABASE d

 3       WHERE tp.PLATFORM_NAME = d.PLATFORM_NAME;

PLATFORM_IDSUBSTR(D.PLATFORM_NAME,1,30)

-----------------------------------------------------------------------

ENDIAN_FORMAT

--------------

        13 Linux x86 64-bit

Little

 

根据平台名称,拷贝出文件名称。

converttablespace xxyy             to platform="Linux x86 64-bit" FORMAT'/u01/oradata/servdb/%U';

 

测试操作过程如下

[oracle@xxtradedb1servdb]$ rman target /

 

RecoveryManager: Release 10.2.0.4.0 - Production on Wed Apr 18 13:13:04 2012

 

Copyrigxx(c) 1982, 2007, Oracle.  All rigxxs reserved.

 

connectedto target database: SERVDB (DBID=3658273059)

 

RMAN>convert tablespace xxyy            to platform="Linux x86 64-bit" FORMAT '/u01/oradata/servdb/%U';

 

Startingbackup at 18-APR-12

usingtarget database control file instead of recovery catalog

allocatedchannel: ORA_DISK_1

channelORA_DISK_1: sid=347 devtype=DISK

channelORA_DISK_1: starting datafile conversion

inputdatafile fno=00035 name=/u01/oradata/servdb/datafile/xxyy01.dbf

^[converteddatafile=/u01/oradata/servdb/data_D-SERVDB_I-3658273059_TS-XXYY_FNO-35_e1n8o3nc

channelORA_DISK_1: datafile conversion complete, elapsed time: 00:10:55

Finishedbackup at 18-APR-12

 

第四步,将文件拷贝到目标库所在的系统上

这里使用 scp ,也可以使用 ftp ,那样会更快。

第五步,在目标库上建用户,导入数据

imp userid=\'sys/sys as sysdba\' file=tbs_exp.dmp log=tba_imp.logtransport_tablespace=y datafiles='/dbbackup/servdb_rman/xxyy01.dbf'

第六步,检查表空间状态和调整表空间为读写

虽然目标库是 RAC ,文件又是保存在 ASM 上,但是也不是不能访问文件系统上的文件。

只是文件系统文件无法共享,所以,只能在一个节点上看到。

/dbbackup/servdb_rman@webdg1=>xxzq1$sqlplus/ as sysdba

 

SQL*Plus:Release 10.2.0.4.0 - Production on Wed Apr 18 16:39:56 2012

 

Copyrigxx(c) 1982, 2007, Oracle.  All Rigxxs Reserved.

 

 

Connectedto:

OracleDatabase 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production

Withthe Partitioning, Real Application Clusters, OLAP, Data Mining

andReal Application Testing options

 

SQL>set linesize 300

SQL>col name format a50

SQL>r

 1* select file#,name,status from v$datafile

 

    FILE#NAME                                              STATUS

------------------------------------------------------------ -------

        1 +LOGDG/xxzq/system01.dbf                          SYSTEM

        2 +LOGDG/xxzq/undotbs01.dbf                         ONLINE

        3 +LOGDG/xxzq/sysaux01.dbf                          ONLINE

        4 +LOGDG/xxzq/users01.dbf                           ONLINE

        5 +LOGDG/xxzq/undotbs02.dbf                         ONLINE

        6 +LOGDG/xxzq/tbs_yy01.dbf                          ONLINE

        7 /dbbackup/servdb_rman/xxyy01.dbf                  ONLINE

 

7rows selected.

这个结果表空间的数据在其他实例上也操作了,将导致系统宕机,因为其他实例根本不能读写到这个系统上的文件。

我们正常将是设置为读写状态。这是为了将文件从文件系统上迁移到 ASM 上。

SQL>alter tablespace xxyy read write;

如果不将表空间设置为读写状态,则对此表空间文件的 COPY 将出错。开始我也没设置为读写,所以报错了。

RMAN>backup as copy datafile '/dbbackup/servdb_rman/xxyy01.dbf' format '+LOGDG/xxzq/xxyy01.dbf';

 

Startingbackup at 18-APR-12

usingchannel ORA_DISK_1

RMAN-00571:===========================================================

RMAN-00569:=============== ERROR MESSAGE STACK FOLLOWS ===============

RMAN-00571:===========================================================

RMAN-03002:failure of backup command at 04/18/2012 16:45:25

RMAN-20201:datafile not found in the recovery catalog

RMAN-06010:error while looking up datafile: /dbbackup/servdb_rman/xxyy01.dbf

 

RMAN>exit

设置为读写后,正常将数据文件拷贝一份到了 ASM 上。

backupas copy datafile '/dbbackup/servdb_rman/xxyy01.dbf' format '+LOGDG/xxzq/xxyy01.dbf';

第七步,将文件离线,在重命名就可以了。

SQL>alter database datafile '/dbbackup/servdb_rman/xxyy01.dbf' offline;

 

Databasealtered.

 

SQL>alter database rename file '/dbbackup/servdb_rman/xxyy01.dbf' to '+LOGDG/xxzq/xxyy01.dbf';

 

Databasealtered.

 

SQL>select name from v$datafile;

 

NAME

--------------------------------------------------------------------------------

+LOGDG/xxzq/system01.dbf

+LOGDG/xxzq/undotbs01.dbf

+LOGDG/xxzq/sysaux01.dbf

+LOGDG/xxzq/users01.dbf

+LOGDG/xxzq/undotbs02.dbf

+LOGDG/xxzq/tbs_yy01.dbf

+LOGDG/xxzq/xxyy01.dbf

 

7rows selected.

 

SQL>alter database datafile 7 online;

alterdatabase datafile 7 online

*

ERRORat line 1:

ORA-01113:file 7 needs media recovery

ORA-01110:data file 7: '+LOGDG/xxzq/xxyy01.dbf'

 

 

SQL>recover datafile 7;

Mediarecovery complete.

SQL>alter database datafile 7 online;

 

Databasealtered.

 

SQL>exit

迁移实际上到这步就结束了。

但最后想到一个问题。

我们将文件使用 copy 拷贝到了 asm 中,然后让实例使用了。

这时, rman 的catalog 还是认为这个文件是它的一个拷贝,虽然不能删除,但始终是个芥蒂。

/dbbackup/servdb_rman@webdg1=>xxzq1$rmantarget /

 

RecoveryManager: Release 10.2.0.4.0 - Production on Wed Apr 18 16:20:36 2012

 

Copyrigxx(c) 1982, 2007, Oracle.  All rigxxs reserved.

 

connectedto target database: XXZQ (DBID=485623294)

 

RMAN>list copy;

 

usingtarget database control file instead of recovery catalog

specificationdoes not match any archive log in the recovery catalog

 

Listof Datafile Copies

Key    File S Completion Time Ckp SCN    CkpTime        Name

----------- - --------------- ---------- --------------- ----

3      7    A 18-APR-12       9853271475418-APR-12       +LOGDG/xxzq/xxyy01.dbf

尝试使用 RMAN 的switch 作数据文件重命名,但 rman 中还是有这个记录,不能除掉。

 

RMAN>switch datafile '/dbbackup/servdb_rman/xxyy01.dbf'  to copy;

最后,想到一个方法。使用 convert 代替 copy 将数据文件复制到 ASM 中。 convert 操作是不在 catalog 中留记录的。

上面列的操作步骤在第四步之后就进行跳转。

第四步中将文件传输到文件系统中后,使用 rman convert 将文件复制一份到 ASM 磁盘组中。

这个 convert 功能在 rman catalog 中不保留记录,可以实现 ASM 和文件系统的文件相互转移。

方法如下:

convertdatafile '/dbbackup/servdb_rman/xxyy01.dbf' format '+LOGDG/xxzq/xxyy01.dbf';

这个文件约 5GB ,所用时间为 35 秒。

RMAN>convert datafile '/dbbackup/servdb_rman/xxyy01.dbf' format '+LOGDG/xxzq/xxyy01.dbf';

 

Startingbackup at 19-APR-12

usingtarget database control file instead of recovery catalog

allocatedchannel: ORA_DISK_1

channelORA_DISK_1: sid=105 instance=xxzq1 devtype=DISK

channelORA_DISK_1: starting datafile conversion

inputfilename=/dbbackup/servdb_rman/xxyy01.dbf

converteddatafile=+LOGDG/xxzq/xxyy01.dbf

channelORA_DISK_1: datafile conversion complete, elapsed time: 00:00:35

Finishedbackup at 19-APR-12

第五步,在目标库上建用户,导入数据

imp userid=\'sys/sys as sysdba\' file=tbs_exp.dmp log=tba_imp.logtransport_tablespace=y datafiles='+LOGDG/xxzq/xxyy01.dbf'

这个步骤和上述用的差别就是文件名称的差别。

第六步,检查表空间状态和调整表空间为读写

因为数据文件本身就在 ASM 磁盘组上, RAC 的两个节点都能访问得到该文件,所以我们先查查文件状态。

SQL>set linesize 300

SQL>col name format a50

SQL>r

 1* select file#,name,status from v$datafile

 

    FILE#NAME                                              STATUS

------------------------------------------------------------ -------

        1 +LOGDG/xxzq/system01.dbf                          SYSTEM

        2 +LOGDG/xxzq/undotbs01.dbf                         ONLINE

        3 +LOGDG/xxzq/sysaux01.dbf                          ONLINE

        4 +LOGDG/xxzq/users01.dbf                           ONLINE

        5 +LOGDG/xxzq/undotbs02.dbf                         ONLINE

        6 +LOGDG/xxzq/tbs_yy01.dbf                          ONLINE

        7 +LOGDG/xxzq/xxyy01.dbf                         ONLINE

 

7rows selected.

所有文件都是 ONLINE 的状态。

我们将其设置为读写状态,这样用户就可以读写迁移过来的表空间中的所有对象了。

SQL>alter tablespace xxyy read write;

我们回到 RMAN 中,使用 list copy 检查一下文件有没有拷贝记录。

/u01/oracle/home@webdg1=>xxzq1$rmantarget /

 

RecoveryManager: Release 10.2.0.4.0 - Production on Thu Apr 19 09:46:23 2012

 

Copyrigxx(c) 1982, 2007, Oracle.  All rigxxs reserved.

 

connectedto target database: XXZQ (DBID=485623294)

 

RMAN>list copy;

 

usingtarget database control file instead of recovery catalog

specificationdoes not match any archive log in the recovery catalog

结果和我们想的一样,在 rman catalog 中没有任何记录。因此该方法应该是首选。

总结

对已大数据量的迁移工作,使用表空间传输的方法实现是效率比较高的一种方法。

exp/expdp 迁移 metadata , rman convert 迁移数据文件。

他们的联合使用,可以支持跨平台、跨文件系统的迁移,这点在环境复杂的项目中非常有用。


http://www.niftyadmin.cn/n/1552009.html

相关文章

[Linux命令]文件和目录操作相关命令

显示文件内容命令用户需要查看一个文件的内容时,可以根据显示要求的不同选用以下的命令。cat命令功能1:在标准输出上显示文件。语法:cat [ - 选项 ] 文件说明:该命令功能之一是用来显示文件。它依次读取其后…

ASM和OS文件系统之间交互

主要有3种方法: dbms_file_transfer包、rman的convert命令,或FTP的形式,这里只介绍前两种方法 一、使用dbms_file_transfer包 将DATA/RAC/spfilerac.ora拷贝到文件系统ASMCMD [DATA/RAC] > lsARCHIVELOG/CHANGETRACKING/CONTROLFILE/DATAFILE/ONLI…

[Linux命令]目录的创建与删除命令

mkdir命令功能:创建一个目录(类似DOS下的md命令)。语法:mkdir [选项] dirname说明:该命令创建由dirname命名的目录。要求创建目录的用户在当前目录中(dirname的父目录中)…

oracle10g的rac中,客户端连接报ora-12545错误

在oracle10g的rac中﹐客户端连接的时候不时报﹕ORA-12545错误网友的解决办法是﹕solaris下oracle10g rac 报ora-12545错误解决方案这几天安装oracle rac,我也主要是学习阶段.数据库安装完毕,启动正常,监听启动正常.问题来了.一、问题描述操作系统solaris 10 1/06 sparc 64bit&…

[Linux命令]文件的复制、删除和移动命令

cp命令该命令的功能是将给出的文件或目录拷贝到另一文件或目录中,就如同DOS下的copy命令一样,功能非常强大。语法: cp [选项] 源文件或目录 目标文件或目录说明:该命令把指定的源文件复制到目标文件或把多个…

Oracle RAC一节点系统重做问题

在Oracl RAC 10.2.0.4 两个节点,操作系统为Linux 的环境中,一节点服务器的本地硬盘突然全部损坏,停止运行。剩下的一个节点还能正常工作,继续提供对外数据库服务。问题很清楚,硬盘损坏的服务器在操作系统重做后&#…

[Linux命令]备份与压缩命令

用户经常需要备份计算机系统中的数据,为了节省存储空间,常常将备份文件进行压缩。下面分别介绍备份与压缩的命令。tar命令tar可以为文件和目录创建档案。利用tar,用户可以为某一特定文件创建档案(备份文件)&#xff0c…

10g rac节点的添加和删除

前提条件:这是对一套基于两个节点的rac环境的添加,添加节点之前已安装好操作系统;内核参数已经进行修改;ORACLE用户已初始化;成功并正确的配置和共享存储;相关rpm包均已配置;与当前rac环境中各个节点互通。一 .初始化第三台节点首先就需要对新节点进行适当的配置,以满足rac中的…