Oracle数据库——xTTS技术的使用

NiuJinlin 

关于xTTS(增量传输表空间)技术,在网上没有特别多的描述,但是在大数据量的增量迁移,减少停机时间,保证业务访问的前提下,xTTS可以替代OGG(毕竟Oracle Golden Gate不是免费的软件)成为迁移的首选。本文将对xTTS的使用方法做一个详细的介绍:

首先交代一下实验环境:

Source:

Operation-System: Red Hat Enterprise Linux 5.5

Oracle-Software: Oracle Database 11g Release 2 (11.2.0.4.0)

Global-database-name: ora11g01.us.oracle.com

Hostname: ora11g01.us.oracle.com IP-address:172.25.0.30

Destination:

Operation-System: Red Hat Enterprise Linux 5.5

Oracle-Software: Oracle Database 11g Release 2 (11.2.0.4.0)

Global-database-name: ora11g02.us.oracle.com

Hostname: ora11g02.us.oracle.com IP-address:172.25.0.40

由于我这里没有搭建不同字节序操作系统的条件,就统一使用RedHat操作系统进行演示,实际生产中需要更改平台ID,以完成跨平台的表空间迁移。

一、xTTS技术的三个阶段:

1.准备阶段:

在准备阶段中,源端相关表空间的数据文件备份要传输到目标端操作系统相关目录下,并且完成字节序的转换,Application在准备阶段是完全可访问的。

准备阶段可以通过RMAN备份来完成,也可以通过dbms_file_transfer来完成,本文将使用基于RMAN备份的xTTS技术。

2.前滚阶段:

类似于Oracle数据库中的前滚,既然是增量的传输,一定会有前滚数据的需要。

在前滚阶段中,在准备阶段中备份并且完成字节序转换的数据文件将会使用源端(Source)的增量备份来进行前滚使得数据达到最新状态。通过多次执行该阶段,使得每个连续的增量备份的应用变得更加快速,从而也使得目标端(Destination)数据库和源端数据库的数据更加接近。

3.传输阶段:

在传输阶段中,表空间将被置为只读(Read-Only Mode)方式传输,将会最后执行一次源端数据库的增量备份并且应用在目标端上,使得目标端数据库中数据可以与源端完全一致。

当数据备份中的内容完全一致时,导出源端数据库元数据,并加载到目标端数据库中。

最后,将相关的表空间置为读写模式(Read-Write Mode),使得迁移完毕,并且恢复正常业务,在这个阶段中,应用不能接受任何的DML操作。

二、关于xTTS技术三个阶段的总结:

通过上面的流程我们可以发现,xTTS其实是一定程度上的增量,不能做到真正的“0停机时间”,但是可以进行增量的数据传输,可以大幅度的减少停机时间,完成跨平台的数据迁移。但是需要注意的是:

xTTS同样具有TTS技术相同的缺点,基于System表空间的数据库对象将会丢失,需要自己通过dbms_metadata.get_ddl或者第三方工具自行创建。

三、跨平台增量备份支持脚本

xTTS需要Oracle的版本在11.2.0.4.0及以后的版本,如果需要迁移更早的版本,则需要创建转换实例进行版本的转换。

完成xTTS技术需要相关的脚本,rman-xttconvert_2.0.zip文件可以在MyOracleSupport自行下载(文档ID 1389592.1),也可以通过发邮件到笔者邮箱18306392321@163.com进行索取。

四、xTTS技术的具体步骤

阶段1:初始化阶段

阶段 1.1 - 安装目标端数据库软件并且创建数据库

具体方法不再赘述,通过dbca或者create database语句自定义数据库均可。

阶段 1.2 - 如果有必要,配置增量转换家目录和实例

如果要迁移的版本低于11.2.0.4.0,那么需要创建convert_home和convert_instance:

[oracle@ora11g02]$ export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/\

xtt_home

[oracle@ora11g02]$ export ORACLE_SID=xtt

[oracle@ora11g02]$ cat << EOF > $ORACLE_HOME/dbs/ \

init$ORACLE_SID.ora \

db_name=‘xtt’ \

compatible=’11.2.0.4.0’ \

EOF

[oracle@ora11g02]$ sqlplus “/as sysdba” << EOF \

startup \

EOF

阶段 1.3 - 验证相关表空间是否可以被传输

使用dbms_tts来验证相关表空间是否为自包含或者是半包含表空间,如果不是,那么将不能完成相关表空间的传输。

阶段 1.4 - 创建database link用于传输元数据(可以不做)

这个步骤并不是必要的,后期可以使用expdp抽取本地DUMP文件来完成元数据的传输,不需要通过网络的方式来完成。

SQL@ora11g02> create public database link ttslink

  connect to system identified by oracle

  using ‘ora11g01’;

(这里就不再对ora11g01本地连接名的配置做赘述)

SQL@ora11g02> select * from dual@ttslink;

阶段 1.5 - 创建stage area

根据xtt.properties文件中定义的backupformat参数和backupondest参数,在源端和目标端操作系统创建stage area。 //*stage area指的是存放数据库备份的区域,用来完成xTTS的中间过程必须存在的区域*//

如果在准备阶段使用RMAN备份,使用xtt.properties中定义的dicopydir和stageondest参数来创建stage area。

阶段 1.6 - 安装xttconvert脚本

[oracle@ora11g01]$ mkdir -p /home/oracle/xtt\

&& cd /home/oracle/xtt

[oracle@ora11g01]$ unzip rman-xttconvert_2.0.zip

该脚本将会解压出的文件有:

xttcnvrtbkupdest.sql, xttdbopen.sql ,xttdriver.pl ,xttprep.tmpl ,xtt.properties ,xttstartupnomount.sql

阶段 1.7 - 在源端配置xtt.properties文件

[oracle@ora11g01]$ mv xtt.properties xtt.properties.bak

[oracle@ora11g01]$ cat xtt.properties.bak | grep -v ^# | grep -v ^$ > xtt.properties

[oracle@ora11g01]$ cat xtt.properties

tablespaces=TEST_TAB  ##源端要传输的表空间

platformid=13 ##源端操作系统平台号,可以在

v$transportable_platform视图中获取

#srcdir=SOURCEDIR1,SOURCEDIR2

#dstdir=DESTDIR1,DESTDIR2

#srclink=TTSLINK ##这三行被注释的参数,在基于dbms_file_transfer的方

法中会被用到,这里我已经注释掉

dfcopydir=/home/oracle/copies #对于接下来四行参数对应的路径,

backupformat=/home/oracle/copies 在之前已经所有描述,就不在这里

stageondest=/home/oracle/copies 进行赘述。

backupondest=/home/oracle/copies

storageondest=/u01/app/oracle/oradata/ora11g02 ##该参数对应的路径决

定了目标段数据文件存放的位置

#parallel=3

#rollparallel=2

#getfileparallel=4 ##这三个并行参数不再多解释,对应之前的各个阶段的并行

#cnvinst_home=/u01/app/oracle/product/11.2.0/xtt_home

#cnvinst_sid=xtt ##这里用语指定转换实例(低于11.2.0.4.0的xTTS)

阶段 1.8 - 将xtt-rmanconvert脚本传输到目标端系统

[oracle@ora11g01]$ scp -r /home/oracle/xtt oracle@ora11g02:~

阶段 1.9 - 设置TMPDIR

在源端和目标端系统上,都需要设置Shell变量TMPDIR,该变量对应的路径用语支持中间脚本的存放。

[oracle@ora11g01]$ export TMPDIR=/home/oracle/xtt

[oracle@ora11g02]$ export TMPDIR=/home/oracle/xtt




阶段2:准备阶段(这里对应着三个阶段的第一阶段)

由于这里我们使用的是RMAN脚本备份的方式,就不再进行第一种方式的描述,需要的朋友请到MyOracleSupport自行查询前面提到的文档。

阶段 2.1 - 在源端运行准备脚本

在源端操作系统登录Oracle软件拥有者用户,设置ORACLE_HOME和ORACLE_SID变量用语指向源端数据库。

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

该脚本做了以下事情:

1.在dfcopydir指定的目录下创建需要传输的数据文件备份

2.验证数据文件是否在读写模式,并且没有offline的数据文件

3.创建相关中间脚本:xttplan.txt ## 记录要传输的表空间和scn信息

rmanconvert.cmd ## 在目标端convert数据文件的脚本,其中转

换后的路径是基于参数storageondest来指定的。

我们看一下脚本的内容

[oracle@ora11g01]$ cat xttplan.txt

TEST_TAB::::976843 ## 要传输的表空间名,传输时的scn信息

5 ## 要传输的表空间号

[oracle@ora11g01]$ cat rmanconvert.cmd

host 'echo ts::TEST_TAB'; 

  convert from platform 'Linux x86 64-bit

  datafile 

  '/home/oracle/copies/TEST_TAB_5.tf' 

  format '/u01/app/oracle/oradata/ora11g02/%N_%f.xtf' 

parallelism 8;

我们看一下蓝色标注的部分,第一部分是平台名称,这个是根据我们之前在xtt.properties里面填写的platform_id来决定的。

第二部分是生成的数据文件名,这个是根据backupformat参数来决定的,如果现在查看/home/oracle/copies目录,会发现该备份已经生成。

[oracle@ora11g01]$ ls -l /home/oracle/copies

total 102512

-rw-r----- 1 oracle oinstall 104865792 Nov 21 22:14 TEST_TAB_5.tf

第三部分就是由storageondest参数来决定的,我们可以看出来这个语句应该是在目标数据库上执行的一次数据文件转换平台的语句。

对于后面的并行度8,这个是生成脚本默认的。

阶段 2.2 - 传输备份文件到目标系统

我们将刚才脚本生成的数据文件备份传输到目标平台上,以便后期的增量应用。

[oracle@ora11g01]$ scp /home/oracle/copies/TEST_TAB_5.tf \

oracle@ora11g02:/home/oracle/copies

阶段 2.3 - 在目标端数据库转换数据文件备份

将源端的rmanconvert.cmd传输到目标端$TMPDIR对应的目录下,并执行相应脚本。

[oracle@ora11g01]$ scp rmanconvert.cmd oracle@ora11g02:/home/ \

oracle/xtt

[oracle@ora11g02]$ $ORACLE_HOME/perl/bin/perl xttdriver.pl -c

完成这一步后,stageondest中指定路径(我这里是/home/oracle/copies)中的数据文件备份就可以删除了,没有任何作用了。




阶段3:前滚阶段

在前滚阶段中,将会在源端数据库创建增量备份文件,并且传输到目标端转换成目标端操作系统字节序(Endian),最后通过增量备份文件完成对转换后数据文件的前滚。这个阶段可以运行多次,从而减少数据量的丢失,并且减少最后阶段的时间,这个阶段中数据也是完全可访问并且可以修改的。业务不会受到影响。

首先自行创建一下增量数据,以方便我们观察实验结果,增量数据的创建方法和环境的初始化方法会在文档的最后贴出。

阶段 3.1 - 在源端创建相关表空间的增量备份

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

这个脚本将会生成两个文件:

tsbkupmap.txt    ## 记录表空间名,表空间id,增量次数和增量备份名称

incrbackups.txt  ## 记录了增量备份文件所在位置

两个文件的内容就不再贴出,大家自己使用cat命令查看即可。

阶段 3.2 - 传输增量备份到目标端stage area

[oracle@ora11g01]$ scp `cat incrbackups.txt` oracle@ora11g02\

:/home/oracle/copies

阶段 3.3 - 转换增量备份并在目标端进行应用

[oracle@ora11g01]$ scp /home/oracle/xtt/xttplan.txt \

oracle@ora11g02:/home/oracle/xtt

[oracle@ora11g01]$ scp /home/oracle/xtt/tsbkupmap.txt \

oracle@ora11g02:/home/oracle/xtt

[oracle@ora11g02]$ $ORACLE_HOME/perl/bin/perl xttrdriver.pl -r 

如果该命令发生了报错,很难排查。但是Oracle提供了debug功能让我们来看一下到底在哪儿出现了错误。

[oracle@ora11g02]$ export XTTDEBUG=1

此时再次执行$ORACLE_HOME/perl/bin/perl xttrdriver -r 就可以看到该脚本执行的详细信息了。

阶段 3.4 - 为下一次增量备份确定FROM_SCN(增量备份起点)

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

这个scn信息将会再次被记录在xttplan.txt中。所以再次执行$ORACLE_HOME/perl/

bin/perl xttdriver.pl时,该脚本还会读取该文件。

阶段 3.5 - 重复整个阶段3的步骤

在这个阶段有两种选择:

1.你想进一步缩短数据的同步差距,从而减少最后一步切换到只读模式的时间减少,那么重复整个第三阶段的步骤。

2.如果数据已经很接近最终数据,那么可以直接进入传输阶段。

由于我没有在源端数据库继续插入新的数据,所以这里我选择第二步,在生产过程的迁移中,建议使用第一种,多做几次,再进入传输阶段,可以大大减少停机时间。




阶段4:传输阶段

在这个阶段中,源端数据库将会被置为只读模式,目标端数据库将会完成最后一次增量应用以达成和源端数据的完全一致,最后将数据库元数据导入,并将表空间置为读写模式,完成数据的迁移。

该阶段就是真正数据库要停机的时间,要想停机时间足够短,请在阶段3的时候多做几次增量备份的应用。

阶段 4.1 - 将源端表空间置为只读

SQL> alter tablespace test_tab read only;

Tablespace altered.

阶段 4.2 - 创建最后一次增量备份,传输,转换,并且完成应用增量备份

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

[oracle@ora11g01]$ scp `cat incrbackups.txt` oracle@ora11g02:\

/home/oracle/copies

[oracle@ora11g01]$ scp xttplan.txt oracle@ora11g02:/home/oracle/xtt

[oracle@ora11g01]$ scp tsbkupmap.txt oracle@ora11g02:/home/oracle\

/xtt

[oracle@ora11g02 ]$ $ORACLE_HOME/perl/bin/perl xttdriver.pl -r 

阶段4.3 - 导入元数据到目标数据库

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

这里可以用impdp直接网络导入元数据,使用dblink

命令如下:

[oracle@ora11g02]$ impdp \'/ as sysdba\' directory=tts\ 

network_link=ttslink \ 

transport_full_check=no transport_tablespaces=test_tab\

transport_datafiles=‘/u01/app/oracle/oradata/ora11g02/\

TEST_TAB_5.xtf’ 


阶段 4.5 - 将目标数据库表空间置为读写模式并验证数据完整性

SQL> alter tablespace test_tab read write;

Tablespace Alterd.

SQL> validate tablespace test_tab check logical;




五、关于xTTS技术的注意事项:

1.stage_area(stage area):用语存放数据库完整备份和增量备份

2.$TMPDIR:perl执行脚本过程中生成的.txt .cmd等文件,全部在该路径下,但执行perl脚本请在rman-xttconvert_2.0目录下进行

3.注意XTTDEBUG=1的使用,可以进行排错

4.database_link使用时要注意tnsnames.ora文件的配置

5.生产环境中要多做几次阶段3,来缩短数据库的停机时间。




六、环境初始化和增量数据创建:

创建初始化数据:

SQL> create tablespace test_tab datafile '/u01/app/oracle/oradata/ora11g01/test_tab.dbf' size 100m autoextend on;

Tablespace created.

SQL> create user njl identified by oracle;

User created.

SQL> grant connect,resource to njl;

Grant succeeded.

SQL> alter user njl default tablespace test_tab;

User altered.

SQL> create table njl.t1(id number);

Table created.

SQL> begin    

  2  for i in 1..100 loop

  3  insert into njl.t1 values (i);

  4  end loop;

  5  end;

  6  /

PL/SQL procedure successfully completed.

SQL> commit;

Commit complete.

SQL> select count(*) from njl.t1;

  COUNT(*)

----------

       100

创建增量数据:

SQL> create table njl.t2 (id number);

Table created.

SQL>begin

  2  for i in 1..10000 loop

  3  insert into njl.t2 values(i);

  4  end loop;

  5  end;

  6  /

PL/SQL procedure successfully completed.

SQL> commit;

Commit complete.

SQL> select count(*) from njl.t2;

  COUNT(*)

----------

     10000

希望我的文章对大家有用,也希望大家对我的文章中的理解偏差和错误进行批评。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31401355/viewspace-2129201/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/31401355/viewspace-2129201/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值