`
mikixiyou
  • 浏览: 1100669 次
  • 性别: Icon_minigender_1
  • 来自: 南京
博客专栏
C3c8d188-c0ab-3396-821d-b68331e21226
Oracle管理和开发
浏览量:353680
社区版块
存档分类
最新评论

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

阅读更多

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

这里采用 RMAN CONVERT 功能和 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 * FROM V$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_ID SUBSTR(D.PLATFORM_NAME,1,30)

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

ENDIAN_FORMAT

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

         13 Linux x86 64-bit

Little

 

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

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

 

测试操作过程如下

[oracle@xxtradedb1 servdb]$ rman target /

 

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

 

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

 

connected to target database: SERVDB (DBID=3658273059)

 

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

 

Starting backup at 18-APR-12

using target database control file instead of recovery catalog

allocated channel: ORA_DISK_1

channel ORA_DISK_1: sid=347 devtype=DISK

channel ORA_DISK_1: starting datafile conversion

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

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

channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:10:55

Finished backup at 18-APR-12

 

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

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

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

imp  userid=\'sys/sys as sysdba\' file=tbs_exp.dmp log=tba_imp.log transport_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.

 

 

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production

With the Partitioning, Real Application Clusters, OLAP, Data Mining

and Real 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

 

7 rows selected.

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

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

SQL> alter tablespace xxyy read write;

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

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

 

Starting backup at 18-APR-12

using channel 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 上。

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

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

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

 

Database altered.

 

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

 

Database altered.

 

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

 

7 rows selected.

 

SQL> alter database datafile 7 online;

alter database datafile 7 online

*

ERROR at line 1:

ORA-01113: file 7 needs media recovery

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

 

 

SQL> recover datafile 7;

Media recovery complete.

SQL> alter database datafile 7 online;

 

Database altered.

 

SQL> exit

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

但最后想到一个问题。

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

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

/dbbackup/servdb_rman@webdg1=>xxzq1$rman target /

 

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

 

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

 

connected to target database: XXZQ (DBID=485623294)

 

RMAN> list copy;

 

using target database control file instead of recovery catalog

specification does not match any archive log in the recovery catalog

 

List of Datafile Copies

Key     File S Completion Time Ckp SCN    Ckp Time        Name

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

3       7    A 18-APR-12       98532714754 18-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 和文件系统的文件相互转移。

方法如下:

convert datafile '/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';

 

Starting backup at 19-APR-12

using target database control file instead of recovery catalog

allocated channel: ORA_DISK_1

channel ORA_DISK_1: sid=105 instance=xxzq1 devtype=DISK

channel ORA_DISK_1: starting datafile conversion

input filename=/dbbackup/servdb_rman/xxyy01.dbf

converted datafile=+LOGDG/xxzq/xxyy01.dbf

channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:35

Finished backup at 19-APR-12

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

imp  userid=\'sys/sys as sysdba\' file=tbs_exp.dmp log=tba_imp.log transport_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

 

7 rows selected.

所有文件都是 ONLINE 的状态。

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

SQL> alter tablespace xxyy read write;

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

/u01/oracle/home@webdg1=>xxzq1$rman target /

 

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

 

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

 

connected to target database: XXZQ (DBID=485623294)

 

RMAN> list copy;

 

using target database control file instead of recovery catalog

specification does not match any archive log in the recovery catalog

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

总结

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

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

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

 

 

分享到:
评论

相关推荐

    基于RMAN+可传输表空间TTS迁移AIX平台数据库到Linux

    7. EXPDP/IMPDP工具:在使用可传输表空间特性时,EXPDP和IMPDP(Data Pump导出和导入)工具用于迁移表空间对象的元数据,它们是Oracle数据库进行大规模数据迁移的重要工具。 8. 注意事项:源和目标数据库的数据库...

    exp 与expdp的使用

    ### Oracle 数据库导出工具 exp 与 expdp 的使用...这种方法不仅可以显著减少导出的时间和存储空间的需求,还能够确保关键数据的安全性和完整性。在实际应用中,可以根据具体情况调整导出的范围,以达到最佳的效果。

    利用RMAN可传输表空间迁移数据库到不同字节序的平台.docx

    Oracle数据库提供了强大的跨平台数据迁移功能,特别是通过RMAN(Recovery Manager)实现的可传输表空间技术。这个功能使得用户可以在不同字节序的平台上迁移数据库,从而实现硬件升级、操作系统更换或数据中心迁移等...

    impdp / expdp or imp/exp

    impdp 和 expdp 命令可以实现 Oracle 数据库之间的数据传输,例如从 Oracle 10g 到 Oracle 11g 的数据传输。 impdp 命令的基本格式为:impdp 用户名/密码@例程名 DUMPFILE=data.dmp version=Oracle 版本号 其中,...

    exp/imp导出导入工具的使用

    需要注意的是,由于它们处理的数据量可能很大,因此在使用时应充分考虑性能和存储空间。同时,对于大型数据库,更推荐使用 RMAN(Recovery Manager)或 Data Pump(expdp/impdp)工具,因为它们提供了更高的性能和更...

    【TTS】传输表空间 AIX_To_Linux_基于rman.pdf

    根据上述知识点,可以总结出文档详细说明了Oracle中使用RMAN和TTS在不同操作系统平台之间传输表空间的方法,强调了对相关技术要点的理解,如平台字节序和自包含概念,同时也提到了expdp/impdp工具在数据迁移中的应用...

    使用可传输表空间的特性复制数据

    使用可传输表空间的特性复制数据 知识点一:什么是可传输表空间(Transportable Tablespaces) 可传输表空间是 Oracle 提供的一种特性,用于进行库对库的表空间复制。要使用可传输表空间的特性,oracle 至少是 8i ...

    ORACLE数据库表空间传输方式.

    相比于传统的数据导出导入方式,表空间传输不仅效率更高,而且更加可靠,尤其适用于大数据量的迁移场景。不过,在实际操作过程中还需要仔细规划,确保所有前提条件都得到满足,以避免迁移过程中的各种潜在问题。

    oracle11g expdp impdp 分区表重映射导出导入数据迁移方案

    oracle expdp impdp 分区表重映射导出导入 数据迁移方案,以SI01用户为例子,将用户分区表导出后,将分区表重映射到新的表空间,完成数据迁移和检查。照方案例子按步去做,一定能成功。

    RMAN数据库备份详解

    本文详细讲解了 RMAN 的备份机制以及如何备份,涵盖了数据库备份和 RMAN 备份的概念、RMAN 备份的类型、备份集和镜像副本、备份路径、备份限制等知识点。 一、数据库备份与 RMAN 备份的概念 数据库备份是指将...

    【数据泵】EXPDP导出表结构(真实案例).pdf

    数据泵是Oracle提供的一个强大的数据迁移工具,它支持数据和元数据的快速高效传输。本文档《【数据泵】EXPDP导出表结构(真实案例).pdf》记录了作者在使用数据泵导出表结构的实践经验,并详细列出了关键知识点和操作...

    oracle数据迁移.docx

    在实际应用中,数据泵 expdp/impdp 工具可以用于各种数据迁移场景,例如将某用户所有数据导入另一个用户,并转换表空间;或者将某个表空间中的所有对象导入到另一个表空间中。 oracle 数据迁移是指将 oracle 数据库...

    Oracle数据迁移方案!!!.docx

    6. 局部数据迁移,如在广域网环境下,小数据量推荐使用PL/SQL Developer,而大数据量则推荐使用`exp`导出压缩包,通过网络传输后再用`imp`导入。在局域网内,有更多的选择,如`imp/exp`、`impdp/expdp`和`dblink`。 ...

    exp/imp2导入导出

    通过对 Oracle 表空间创建命令的分析以及对 exp/imp2 导入导出工具的介绍,我们可以看到,在 Oracle 数据库管理中,合理配置表空间属性和灵活运用备份恢复工具对于保障数据的安全性和可靠性至关重要。希望本文能帮助...

    exp,imp 与 expdp,impdp 对比 及使用中的一些优化事项.doc

    - **expdp/impdp**:得益于直接路径模式和并行处理的支持,性能表现更佳,尤其是在大规模数据处理场景下优势明显。 #### 四、使用中的一些优化事项 **1. exp/imp 的优化** - **合理选择模式**:根据实际情况选择...

    Oracle RMAN 32bit到 64bit迁移文档

    因此,我们建议使用 EXPDP 或传输表空间方式来进行迁移。另外,我们还需要注意参数文件的转换和数据库的兼容性问题。 本文档详细介绍了 Oracle RMAN 32位到64位迁移的步骤和注意事项,为用户提供了一个详细的迁移...

    【TTS】传输表空间 AIX_To_Linux.pdf

    6. expdp/impdp的应用:expdp和impdp是Oracle的Data Pump工具中用于数据的导出(export)和导入(import)的命令。Data Pump提供了比传统exp/imp工具更高的性能和更多高级选项,特别是在处理大量数据时。 7. 实施...

    【TTS】传输表空间 Linux_To_AIX_基于rman

    【传输表空间】是Oracle数据库系统中的一种特性,允许用户在不同的数据库实例间移动表空间,这在数据库迁移、灾难恢复或系统整合等场景中非常有用。本篇内容主要介绍了如何在Linux和AIX操作系统之间,利用RMAN...

Global site tag (gtag.js) - Google Analytics