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

XTTS,减少数据库迁移时业务停机时间的利器

2016-03-17 16:04:30

作者:袁清坤新炬网络高级技术专家。


通常我们要进行数据库迁移,可以使用的方案有很多,比如数据泵、RMAN、GoldenGate,甚至是第三方同步软件DSG、DDS等。但这些都要求源端和目标端字节顺序一致,如果字节序不同(Solaris SPARC、AIX、HP-UX迁移至Linux),那只能使用TTS(传输表空间)来操作。

 

但是对于传统的TTS来说,数据量越大,需要的停机时间越长。因此,Oracle提供了一个加强版的XTTS,XTTS可以提供跨平台的增量备份,两者结合可以大大缩减迁移时所需要的停机时间。

 

1传统的跨平台TTS和增强版的XTTS的区别

 

 

  • 一般情况下XTTS有以下几个主要步骤:

    A、将源端数据库表空间设置为READ ONLY模式。

    B、传输数据文件到目标系统。

    C、转换数据文件为目标系统的字节序。

    D、在源端导出元数据,并在目标端导入。

    E、将目标端的数据库表空间设置为READ WRITE。

     

    从上面的步骤可以看出,数据文件在传输过程中,数据库表空间是处于READ ONLY模式的,那么对于大多数业务来说,是不能使用的。因此业务的停机时间将和数据量的大小成正比。数据量越大,转换的时间就越长,停机的时间也就越长。

     

     

    增强版的XTTS提供了跨平台增量备份,使用这个增量备份,可以将前期的数据文件传输、数据文件转换等操作在READ WRITE模式下操作。然后通过多次增量备份恢复,使源端和目标端的数据差异降到最小,最后只需要申请增量备份和恢复的时间即可。因此该方案业务的停机时间将和源端数据块的变化量成正比。

 

  • 因此增强版XTTS的主要步骤将变成如下:

    A、将源端数据文件传输到目标系统。

    B、转换数据文件为目标系统的字节序。

    C、在源端创建增量备份,并传输到目标端。

    D、在目标端恢复增量备份。

    E、重复多次操作C和D步骤。

    F、将源端数据库表空间设置为READ ONLY模式。

    G、最后一次执行C和D步骤。

    H、在源端导出元数据,并在目标端导入。

    I、将目标端的数据库表空间设置为READ WRITE。

 

2增强版XTTS注意事项

 

 

  • 源端系统不能是Windows,数据库COMPATIBLE参数必须是10.2.0以上,且不能高于目标端。

     

  • 增量方式,Oracle提供了以下2种方式,本案例采用的是RMAN backup:

    dbms_file_transfer (DFT) transfer (using xttdriver.pl -S and -G options)

    Recovery Manager (RMAN) RMAN backup(using xttdriver.pl -p and -c options)

     

  • xtt.properties 参数文件配置,该文件非常重要,定义了迁移过程中需要的所有参数。

    platformid=17

    源端平台号,select * from v$transportable_platform order by platform_id 语句查询得到)

    srcdir=SOURCEDIR

    使用数据泵导入原数据,network_link方式,如果使用imp/exp方式,则不需要该参数)

    dstdir=DESTDIR

    使用数据泵导入原数据,network_link方式,如果使用imp/exp方式,则不需要该参数)

    srclink=TTSLINK 

    perl xttdriver.pl -e命令生成impdp迁移脚本使用)

    dfcopydir=/export/home/oracle/dfcopydir

    源端datafile convert保存路径)

    backupformat=/export/home/oracle/backup

    源端增量备份保存路径)

    stageondest=/home/oracle/backup

    目标端备份文件存放路径

    backupondest=/home/oracle/backup 

    目标端增量备份集存放路径

    storageondest=+DATADG/orcldb11g

    目标端恢复到数据库的数据文件保存位置,如果是diskgroup则需要注意还需要对应的数据库名)

    cnvinst_home=/u01/oracle/app/11.2.4/db

    新环境$ORACLE_HOME)

    cnvinst_sid=orcldb11g

    新环境ORACLE_SID)

    asm_home=/home/grid/app/11.2.0/grid

    如果是直接恢复到diskgroup,则需要指定对应的grid_home和ASM实例)

    asm_sid=+ASM

    如果是直接恢复到diskgroup,则需要指定对应的grid_home和ASM实例)

    parallel=3

    设置并行,建议设置为6或者8,根据CPU情况设置)

    rollparallel=2

    roll forward 并行,如果数据库大的话建议设置为8)

    getfileparallel=4

    getfile 并行度,建议设置为6或者8,根据CPU情况设置)

    desttmpdir=/home/oracle/xtts

    设置目标端tempdir目录,建议指向xtts目录)

 

3迁移过程(案例)

 

 

本案例迁移数据总量约4T,客户要求数据库侧停机时间为1小时。以下是使用增强版XTTS迁移的主要步骤:

 

3.1 【源库端】迁移准备阶段

 

在源端配置好xtt.properties参数文件后,测试对应的工具(可选择小型的表空间,仅测试工具的运行功能)

 

  • 源端运行perl脚本,准备Prepare操作命令

    perl  xttdriver.pl  -p

    该操作将在dfcopydir路径下生成需要传输的数据文件的副本,和xttplan.txt、rmanconvert.cmd两个文件。

     

    其中xttplan.txt记录了当前数据库的SCN,如果后面再次运行脚本进行增量操作(perl  xttdriver.pl  -s)时,该值会发现改变。

    $ more xttplan.txt

    SCHEDTS::::14115033957395

    49

     

    rmanconvert.cmd文件则是rman convert脚本,用来转换数据文件的字节序,该脚本需要传输到目标端使用。需要注意的是,在2.0版本工具中,对convert操作增加了并行参数parallelism,一般设置为6或者8,根据CPU或者IO压力负载而定。

    $ cat rmanconvert.cmd

    host 'echo ts::IRM_DATA'; 

      convert from platform 'Solaris[tm] OE (64-bit)' 

      datafile

      '/datadump01/xtts/convert/sdh/IRM_DATA_21.tf'

      ,'/datadump01/xtts/convert/sdh/IRM_DATA_22.tf'

     

    将生产的数据文件副本和这两个文件传输到目标主机上。

 

3.2 【目标端】进行数据文件的转换

 

  • 目标端执行rman convent脚本

    perl  xttdriver.pl  –c

     

    这个步骤将按照rmanconvert.cmd里面记录的信息对数据文件进行转换,以满足目标主机的格式。同时会将这些文件存放到storageondest参数指定的目录,转换完成后,到相应的目录检查数据文件是否完整。

     

    需要注意的是,如果此处报错,那么会在rmanxtts的路径下产生一个FAIL*文件,再次运行前需要删除这个文件,否则无法运行。

 

3.3  【原库端】进行第1次增量备份

 

命令:perl xttdriver.pl –i

 

该命令将对xtt.properties参数文件中指定的表空间,使用RMAN命令进行一个增量备份,同时会生成tsbkupmap.txt、incrbackups.txt、xttplan.txt三个文件,此处就是一个增量备份,没什么好说的,建议打开块跟踪功能(block change tracking),大大缩减增量备份的时间。

 

备份的数据是从做xttdriver.pl  -p时在xttplan.txt文件中记录的SCN开始的。备份完成后需要将这3个文件连同增量备份集一起传输到目标端。

 

但这个步骤仍然有需要注意的地方,在2.0的版本中xtt.properties参数文件有以下几个路径相关的参数:

 

dfcopydir参数:是用来存放源端数据文件副本的,当执行xttdriver.pl –p时产生的数据文件副本就存放在这个位置。

 

backupformat参数:该参数是用来存放源端增量备份产生的备份集的。

 

stageondest参数:该参数是目标端参数,标志将源端数据文件副本存放在目标端的什么位置。目标端在进行convent时会从这个位置找数据文件。

 

backupondest参数:该参数看官方文档的描述是增量备份集存放的路径,但是原厂建议这个参数值要和stageondest参数保持一致。

 

但是实际在操作的时候,还是建议将backupondest和backupformat保持一致,因为在做xttdriver.pl –i时产生的增量备份集将存放在backupformat目录,并且在incrbackups.txt文件中也会记录备份集的位置。incrbackups.txt后期需要传输到目标端进行增量恢复,如果backupondest和backupformat路径不一致,那么就需要修改incrbackups.txt文件中备份集的位置。

 

$ cat incrbackups.txt

/trans/xtts/incrback/sdh/e1q54s3q_1_1

/trans/xtts/incrback/sdh/e2q54s3t_1_1

/trans/xtts/incrback/sdh/e3q54s3v_1_1

 

3.4 【目标端】进行第1次增量recover

 

命令:perl xttdriver.pl –r

 

该步骤就是对增量数据进行恢复,和备份一样没什么好说的。

 

但是如果一套库上有多个实例的话,在执行该步骤之前,需要对环境变量进行确认,如检查当前ORACLE_SID是否是需要执行的SID,否则可能会恢复到其他实例上。(并非是真实的恢复,因为其他实例跟这个备份集没有任何关系,但恢复的过程会在其他实例上进行一遍,如关闭/启动数据库,包括增量恢复的日志都会在另一个数据库上显示。)如果发生了这种事情,不用紧张,调整好环境变量,再执行一次perl xttdriver.pl –r即可。误操作的实例不受影响。

 

3.5 【原库端】进行SCN推进

 

命令:perl xttdriver.pl –s

 

该命令将修改FROM_SCN,用于确定下一次增量备份的起点。建议在【目标端】每次做完recover动作后,【源端】就执行一次该命令,以免遗忘。

 

3.6 【原库端】进行第2-N次增量备份

 

命令:重复3.3、3.4和3.5步骤。

 

3.7 进行最后一次增量备份和恢复

 

  • 【原库端】表空间设置为READ ONLY

    alter tablespace XXXX read only;

 

  • 【原库端】做最后一次增量备份

    perl xttdriver.pl –i

 

  • 【目标端】做最后一次增量恢复

    perl xttdriver.pl –r

    在执行完恢复操作后,脚本会自动将目标库重启,不需要人工干预,如果出现到mount状态出现异常,根据情况手工执行后续命令。

 

3.8 元数据同步

 

  • expdp/impdp导出导入元数据

     

    此步骤也没什么好说的,注意在导出时,TRANSPORT_TABLESPACES参数需要的表空间要写全,别遗漏。如果数据量大,建议去掉统计信息。另外在目标端进行IMPDP时,transport_datafiles需要将所有的数据文件添加进去。如果数据文件很多,人为添加容易出错,可以使用perl xttdriver.pl –e获取全部数据文件列表。

 

3.9 原库和目标库表空间设置为READ WRITE

 

命令:alter tablespace XXXXX read write。

 

到此整个迁移的主要步骤就完成了,剩下的就是要对数据库进行各种检查校验工作了。

上一篇:简述MySQL Replication(复制)基本原理
下一篇:最后一页