当前位置: 首页 > 技术与资源 > 技术分享 > 正文

传送表空间-通过跨平台增量备份

2016-01-20 18:24:01

一.传统方式与跨平台增量备份方式对比

备端为11.2.0.4版本,且在linux上适用

传输表空间(传统)步骤如下:

1、 需要进行传输的表空间,在源库中要设置为Readonly

2、 复制对应的数据文件到 目标操作系统

3、 在目标操作系统,将复制来的数据文件转换为本地endian格式

4、 在源库,将该表空间中所有对象的源数据使用expdp导出来

5、 dump文件复制到目标操作系统,并导入到目标库

6、 将目标库中该表空间设置为读写模式

整个过程完毕。在这整过过程中,源库的表空间必须处于readonly模式,业务停止时间将会很长(数据量越大,停止时间成比例增长)

跨平台增量备份方式,步骤如下:

1、 准备阶段(源库依然处于正常读写状态)

(1)、复制对应的数据文件到目标操作系统

(2)、转换数据文件的endian格式(如果源端和目标端操作系统endian格式 不同的话)
 

2、增量备份前滚阶段(源库依然处于正常读写状态,可以多次执行本阶段,使双方数据不同处越来越小)

(1)、在源端创建增量备份

(2)、复制增量备份到目标端

(3)、在目标端转换增量备份的endian格式,并应用到相应的数据文件上。

3、传输阶段(源端开始成为readonly模式)

(1)、设置源库中该表空间为readonly模式

(2)、最后再执行一次步骤2增量备份前滚阶段

  • 这一步将源端和目标端的数据变为一致。

  • 该阶段对比传统方式,时间将会少的非常多。

(3)、在源库,将该表空间中所有对象的源数据使用expdp导出来

(4)、dump文件复制到目标操作系统,并导入到目标库

(5)、将目标库中该表空间设置为读写模式

二.适用范围

源端操作系统可以是任何操作系统(只要是oracle在官方支持安装数据库的)。

但是目标端必须是64位Linux系统(如Oracle linux或者RHEL)

该方法的一个标准使用环境,从一个big endian平台(AIX,HP-UX或solaris SPARC) 到64位的Linux操作系统(属于littile endian平台)。

如果你系统将表空间,从一个littile endian平台,到另外一个littile endian平台。那么推荐你使用data guard。可查看note 413484.1。

该文档是11G。如果你使用的12C,那么请看 2005729.1。

该文档提供一个传送环境。将一个solaris SPARC 系统上的 TS

1 、TS2 两个表空间 传送到Oracle linux上。

分三个阶段完成该工作:

1.准备阶段:

在准备阶段,表空间相关的数据文件将传送到目标操作系统,并且转换endian格式。在整个准备阶段,源端的表空间依然处于完全可以读写的情况。准备阶段可以通过rman backup或者dbms_file_transfer包进行。

2.前滚阶段:

在前滚阶段,通过使用源数据库一次一次的增量备份,将备份转换后应用到目标库的相应数据文件上。整个阶段,源库的相应表空间依然处于完全可以读写的情况。

3.最终传送阶段:

在整个传送阶段,源端相应表空间将被设置为readonly。相应表空间的最后一个增量备份将被应用到目标端。源端将元信息导出,并在目标端导入,目标端相应表空间设置为读写。

在该阶段,源端的相应表空间数据无法被操作,只可以被查询。

完成该阶段后,整个处理过程完毕。

三.官方提供一个脚本集合

附件1:传送表空间-通过跨平台增量备份1

该脚本集有两个主要的脚本:

  • xttdriver.pl(perl写的)脚本,该脚本执行一些主要步骤。

  • xtt.properties参数文件。

三.注意事项

1.必要条件

  • 可传送表空间本身的限制和注意事项依然需要遵守

    附件2:传送表空间-通过跨平台增量备份2

  • 附加限制

1、 源端不能为windows

2、 源库的COMPATIBLE参数必须设置到10.2.0或更高

3、 源库的COMPATIBLE参数不能高于目标端的COMPATIBLE参数

4、 源端必须是archivelog模式

5、 目标端必须是64位linux

6、 RMAN的default device类型要设置为DISK

7、 源端的DEVICE TYPE DISK不能设有compressed

8、 所有被移动的表空间,必须online,而且不能包含offline的数据文件

  • 运行整个过程的oracle 用户,要属于OSDBA组

  • 源端可目标端已经使用OS authentication。

  • 如果准备阶段决定使用dbms_file_transfer包。那么目标端数据库必须是11.2.0.4

  • 如果准备阶段决定使用RMAN备份,那么源端和目标端都需要中转区

  • 如果目标端数据库版本是11.2.0.3或更低。那么需要在目标端装11.2.0.4 并创建实例,然后用来进行备份集转换。如果11.2.0.4中转实例使用ASM。那么ASM版本也必须是11.2.0.4,否则报错ORA-15295

2.选择准备阶段使用的方法

在准备阶段,表空间对应的数据文件要传送到目标端,并且通过xttdriver.pl转换格式

有两种方法:

1、 使用dbms_file_transfer包(使用xttdriver.pl -S 和 -G选项)

2、 使用RMAN备份 (使用xttdriver.pl -p 和 -c选项)

dbms_file_transfer方法,是使用dbms_file_transfer.get_file()包,在dblink上面将数据文件从源端传送到目标端,这种方法比RMAN方法好的地方是:

1、 不需要中转空间(放备份集)

2、 在传送的时候,数据文件的转换就自动完成了(不存在单独的转换步骤)

该方法需要如下必要条件:

  • 目标端数据库必须是11.2.0.4

  • 源端必须在相关数据文件存在的位置,创建成directory对象

  • 目标端一样,要将放数据文件的位置 设置成directory

  • 源端和目标端创建一个dblink

RMAN备份的方法,在源端,针对相应需要传送的数据文件,创建对应的备份文件。这些备份文件必须手动传送到目标端。在目标端通过RMAN对文件进行转换(如果endian格式不一样的话)。将转换后的文件,放到合适的位置。在原来的版本中,这种方法是唯一的。

通过RMAN备份方法需要如下必要条件:

源端和目标端都需要中转空间用来存放数据文件的备份,这个中转空间的位置 将被xtt.properties文件中的dfcopydir 和stageondest参数使用

经过转换的文件,存入的最终位置,通过xtt.properties文件中的storageondest参数设置

当然,如果版本合适,推荐使用dbms_file_transfer

3.目标端如果是11.2.0.3或者更之前版本

那么需要安装单独的11.2.0.4的数据库软件(增量转换home),并创建一个11.2.0.4的实例(增量转换实例)。

如果你目标端数据库是11.2.0.4,那么你完全可以使用dbms_file_transfer。所以来说,增量转换home和实例基本都用在通过RMAN方法进行转换的。

Troubleshooting

我们可以通过运行xttdriver.pl -d 脚本,或者设置环境变量为XTTDEBUG=1,然后运行xttdriver.pl脚本 来启动debug模式,该模式将会有额外的内容输出。而且所有的执行的所有RMAN命令都是通过debug选项的。

四.已知问题

1、 如果源库包含使用了key compression(键压缩的)索引组织表(IOT),那么目标端库需要打补丁Bug 14835322。

2、 如果希望源库在进行过程中开启 block change tracking。那么需要在源库打补丁Bug 16850197。

3、 要确认RMAN DEVICE TYPE DISK千万不要设置COMPRESSED。

否则在前滚阶段(xttdriver.pl -r)阶段会报错如下:

传送表空间-通过跨平台增量备份3

五.案例正式开始

分为四个阶段:

  • 初始化设置

  • 准备阶段

  • 前滚阶段

  • 最终传送阶段

约定:

  • 所有案例命令格式为bash shell

  • 如[oracle@source]$表示在源端通过oracle用户执行的命令

  • 如[oracle@dest]$表示在目标端通过oracle用户执行的命令

第一阶段:初始化阶段

配置环境

1、 安装目标端数据库软件(如目标端没有数据库),强烈推荐安装11.2.0.4及以后版本。并且在目标端创建相对应用户(源端使用所传送表空间的)

2、 如果目标端是11.2.0.3及之前版本,那么需要安装增量转换home和增量转换实例(11.2.0.4版本)。

在新的目录安装一个11.2.0.4软件,然后启动一个实例到nomount模式

这就增量转换home,以及增量转换实例(不需要创建数据库)

案例语句,在目标端启动一个叫xtt的增量转换实例

传送表空间-通过跨平台增量备份4

如果xtt.properties参数backupondest使用了ASM。那么这个转换实例的COMPATIBLE参数必须等于或者高于ASM的rdbms.compatible参数

3、 确认要传送的表空间

本案例中是TS1 和 TS2

4、 如果是使用dbms_file_transfer方法,那么需要目标端是11.2.0.4

还有另外三个条件:

  • 源端数据文件所在目录创建为directory

  • 目标端数据文件将要存放的位置创建为directory

  • 源库和目标库之间创建dblink

举个例子:

  • 如果源端的相关数据文件位置是在ASM中的+DATA/prod/datafile

    那么在源端数据库执行如下命令:

    SQL@source> create directory sourcedir as '+DATA/prod/datafile';

  • 如目标端最终将把传送来的数据文件存放到+DATA/prod/datafile

    那么在目标端执行如下命令:

    SQL@dest> create directory destdir as '+DATA/prod/datafile';

  • 在目标端创建一个连接到源端的dblink

    SQL@dest> create public database link ttslink connect to system identified by  using '';

  • 验证一下dblink是否生效

    SQL@dest> select * from dual@ttslink;

5、 如果用的RMAN,创建中转区。

6、 源端和目标端都创建一个中转目录,然后在xtt.properties文件中设置参数backupformat,backupondest(用来存放增量备份日志)。

7、 同样,如果使用的是RMAN备份方法,那么同样需要分别创建两个目录,并设置dfcopydir,stageondest参数。具体请参见附录Description of Parameters in Configuration File 。

8、 在源端解压xttconver脚本

传送表空间-通过跨平台增量备份5

9、在源端配置xtt.properties文件

如何配置,参见附录:Description of Parameters in Configuration File 

10、复制xttconver脚本以及修改后的xtt.properties到目标端

[oracle@source]$ scp -r /home/oracle/xtt dest:/home/oracle/xtt。

11、设置TMPDIR,设置到脚本所在目录即可。

设置的目的为,执行xttdriver.pl文件会产生输出文件,如果不设置将会输出到/tmp目录下。

[oracle@source]$ export TMPDIR=/home/oracle/xtt
[oracle@dest]$ export TMPDIR=/home/oracle/xtt

第二阶段:准备阶段

在整个准备阶段,表空间相关的数据文件会被复制到目标端,并且通过xttdriver.pl脚本转换

该阶段有两种方法:

  • dbms_file_transfer ,在下文通过2A表示

  • RMAN备份,在下文通过2B表示

根据目标端的版本,选择你要使用的方法。

2A:准备阶段通过使用dbms_file_transfer完成

通过这种方法,数据文件可以直接从源端传送到目标端的最终位置(不需要中转数据文件),如果需要转换endian格式,它会传送过程中自动完成转换。

2A.1、源端进行准备

oracle用户登录源端。执行下面命令:

[oracle@source]$ $ORACLE_HOME/perl/bin/perl xttdriver.pl -S

该脚本将执行下面动作

  • 验证相应表空间在线,read write模式,没有包含offline数据文件

  • 创建两个之后会用到的文件

  • xttnewdatafiles.txt

  • getfile.sql

检查时,如果存在offline数据文件,或者多个表空间时,其中存在某个readonly表空间,会报错。当然如果全部表空间都是readonly,则不会报错,会继续。但这样和传统传送表空间方式就一样了。

2A.2、传送数据文件到目标端

在目标端,通过oracle用户登录。复制在源端创建好的xttnewdatafiles.txt和getfile.sql文件到目标端。然后执行如下:

注意:这一步会把源端需要传送的数据文件,全部都传送到目标端。时间长短取决于文件大小。可以设置较大的getfilenarallel参数增加传送的并行度

传送表空间-通过跨平台增量备份6

该步完成后,那么源端的相关数据文件将全部传送到目标端的最终位置,如果需要转换endian,那么在传送中已经自动转换完成了。

2B:准备阶段通过使用RMAN备份完成

2B.1、源端进行准备

在源端,通过oracle用户登录,执行下面语句

[oracle@source]$ $ORACLE_HOME/perl/bin/perl xttdriver.pl -p

源端在准备阶段将执行下面动作:

  • 在dfcopydir参数指定的位置创建相关数据文件的copy 

  • 验证表空间处于read write,并且没有包含offline数据文件

  • 创建下列文件,后面会用到

  • xttplan.txt

  • rmanconvert.cmd

检查时,如果存在offline数据文件,或者多个表空间时,其中存在某个readonly表空间,会报错。当然如果全部表空间都是readonly,则不会报错,会继续。但这样和传统传送表空间方式就一样了。

2B.2、传送数据文件copy到目标端

在目标端,用oracle用户登录,将源端的copy手动复制过来。

注意,目标端的存放位置为stageondest参数设置的。

注意,如果是通过NFS共享的目录,这一步可以跳过

[oracle@dest]$ scp oracle@source:/stage_source/* /stage_dest

2B.3、转换数据文件copy的endian模式

在目标端,通过oracle用户,复制rmanconvert.cmd到目标端

传送表空间-通过跨平台增量备份7

整个过程,存放在stageondest的copy,将会转换写入到storageondest参数设置的最终存放点。转换完成后,copy就可以删除了。

第三阶段:日志前滚阶段

在整个阶段,源库生成增量备份,传送到目标端,经过转换然后应用到目标端的数据文件上,这一阶段可以执行多次,直到数据间隔减少到最小。整个阶段,源库的数据依然处于访问状态,不会影响业务。

1、创建针对传送表空间的增量备份(源端)

源端,oracle用户。执行下面步骤。

[oracle@source]$ $ORACLE_HOME/perl/bin/perl xttdriver.pl -i

该步骤创建在xtt.properties文件设置的表空间的增量备份,

并创建两个文件,方便后面使用:

  • tsbkupmap.txt

  • incrbackups.txt

2、传送增量备份到目标端

传送上一步创建好的增量备份(位置由stageondest指定),到目标端

备份数据文件copy的列表,在incrbackups.txt中列出

[oracle@source]$ scp `cat incrbackups.txt` oracle@dest:/stage_dest

注意,如果该目录通过NFS共享在两台机器,这一步可以省略

3、转换增量备份的endian格式,并应用到目标端

在目标端,oracle用户。复制xttplan.txt和tsbkupmap.txt(刚才创建的)到目标端,并且执行:

传送表空间-通过跨平台增量备份8

如果这里是使用增量转换实例,那么该步骤会使用sys用户转换增量备份,然后连接到目标端数据库,并且将转换后的增量备份应用到数据文件上。

注意:每次增量备份生成,你都需要重新拷贝一遍该两个文件。

4、为下次增量备份确定新的起点(FROM_SCN)

源端,oracle用户。执行下面命令:

[oracle@source]$ $ORACLE_HOME/perl/bin/perl xttdriver.pl -s

确定新的FROM_SCAN,然后记录到xttplan.txt。如果再次创建增量备份时,会用到该scn

5、重复前滚或者进入第四阶段

这时候有两个选择

1、 如果需要将目标端的数据更加接近源端的数据,那么重复3

2、如果觉得已经接近了,或者源端数据产生并不多,直接进入下一步

第四阶段:最终传输阶段

这个阶段,源库的相关表空间需要设置为readonly模式,然后生成最后一个增量备份,应用到目标端,使两面数据完全一致。然后将相关表空间中对象的元数据导出,并导入到目标端。

1、源库相关表空间设置为READ ONLY。

传送表空间-通过跨平台增量备份9

2、生成最后一个增量备份,传送,转换,应用到目标端。

传送表空间-通过跨平台增量备份10

3、导入元数据到目标数据库

在目标端,oracle用户登录,执行下面语句

[oracle@dest]$ $ORACLE_HOME/perl/bin/perl xttdriver.pl -e

该语句,将会生成tplugin.txt文件,文件中放有一个案例impdp语句。该语句是根据TRANSPORT_TABLESPACE和TRANSPORT_DATAFILES生成的。

该语句通过dblink直接从源端获取数据,不需要在源端通过expdp生存dump。

该案例语句,需要进行一定修改。修改DIRECTORY,LOGFILE,以及NETWORK_LINK三个参数。

下面是一个通过dblink模式impdp案例命令:

传送表空间-通过跨平台增量备份11

执行完成后,源库就可以设置回read write(如果需要的话)

4、将目标端相应表空间设置回read write。

最后异步,将传送来的表空间设置为read write模式

传送表空间-通过跨平台增量备份12

5、验证数据

在执行上一步之前,我们可以在readonly模式下首先验证一下数据。

应用验证数据。

RMAN验证一下相关表空间的物理块和逻辑块是否存在损坏。

RMAN> validate tablespace TS1, TS2 check logical;

第五阶段:清理

如果在整个过程中使用到了增量转换home和实例,那么现在可以将实例shutdown,将home卸载。

下面参数相关的目录中的内容全部可以清除,包括:

源端中dfcopydir参数指定的目录

  • 源端中backupformat参数指定的目录

  • 目标端中stageondest参数指定的目录

  • 目标端中backupondest参数指定的目录

  • 源端及目标段TMPDIR环境变量指定目录

附录A

Description of Parameters in Configuration File

附件3:传送表空间-通过跨平台增量备份13

附录B

Description of Parameters in Configuration File xtt.properties

附件4:传送表空间-通过跨平台增量备份14

上一篇:端到端的性能分析方案对比
下一篇:实战mongodb3.06分片与复体集