备端为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:
该脚本集有两个主要的脚本:
xttdriver.pl(perl写的)脚本,该脚本执行一些主要步骤。
xtt.properties参数文件。
1.必要条件
可传送表空间本身的限制和注意事项依然需要遵守
附件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)阶段会报错如下:
分为四个阶段:
初始化设置
准备阶段
前滚阶段
最终传送阶段
约定:
所有案例命令格式为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的增量转换实例
如果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
验证一下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脚本
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参数增加传送的并行度
该步完成后,那么源端的相关数据文件将全部传送到目标端的最终位置,如果需要转换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到目标端
整个过程,存放在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(刚才创建的)到目标端,并且执行:
如果这里是使用增量转换实例,那么该步骤会使用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。
2、生成最后一个增量备份,传送,转换,应用到目标端。
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案例命令:
执行完成后,源库就可以设置回read write(如果需要的话)
4、将目标端相应表空间设置回read write。
最后异步,将传送来的表空间设置为read write模式
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:
附录B
Description of Parameters in Configuration File xtt.properties
附件4:
上一篇:端到端的性能分析方案对比
下一篇:实战mongodb3.06分片与复体集