XTTS 跨平台迁移
——停机时间少,可跨平台进行数据迁移
-------------------------------------------------------------------------------------------------------------------
跨版本 跨平台停机时间 场景
数据泵 支持 支持 48小时 数据量较小,或者停机时间没有要求。
GoldenGate 支持 支持 1小时 没有特殊类型的对象,基本没有DDL操作,对rowid变化没
有要求。
XTTS 支持 支持 3-4小时 有一定停机时间,元数据数量可控的系统。
http://blog.itpub.net/31401161/viewspace-2144824/
XTTS两种迁移方式:dbms_file_transfer(版本11.2.0.4以上)rman方式(版本10.2.0.4以上)
XTTS目标端必须是linux,可通过per语言更改xtts脚本,-----------需验证
https://mp.weixin.qq.com/s?__biz=MjM5MDAxOTk2MQ==&mid=2650274770&idx=1&sn=e8670b4145f056b7b87ad9956ab24a7e&chksm=be4863c4893fead22c42c48f6b1cff8899aaee298deff52cda60ff002193d93d91372b692ee4&scene=21#wechat_redirect
1、使用前的检查项:
检查项 | 备注 |
版本 | 保持一致,源端版本高于10.2.0.4,目标端版本不能低于源端 |
安装补丁情况 | 目标端安装到最新的PSU |
时区 | 保持一致 |
字符集 | 保持一致 |
安装组件情况 | 保持一致 |
索引组织表 | 如果有使用key compression的索引组织表,必须在目标端安装补丁,Bug 14835322 |
rman是否开启压缩特性 | 关闭压缩特性 |
检查源端是否有 Cluster 对象 | 迁移后可能需要分析并重建聚簇索引,或是打补丁,bug 17866999 |
sys,system用户是否有对象在业务表空间 | sys.system拥有的对象不会被xtts迁移到目标端,需要重建 |
业务对象是否存在于system,sysaux表空间 | 需要SYSTEM,SYSAUX表空间不会被导出,需要手工导出或重建 |
*应用是否使用了oracle自带用户 | oracle自带用户默认使用system,sysaux表空间,而这两个表空间不会被导出 |
临时表空间 | 是否有业务用户在里面创建了临时表,如果有需要在目标端手工重建 |
检查compatible参数 | 源端大于10.2.0.4,目标端不低于源端 |
表空间是否是自包含 | 如果存在不包含于导出表空间的对象,需要手工重建 |
外部表 | 无法导出外部表,需要手工重建 |
检查物化视图 | 除非组成物化视图的所有对象都在迁移的表空间中,否则无法导出物化视图 |
回收站 | 清空回收站 |
检查表空间和数据文件状态 | 必须是在线,可读写 |
Advanced Queues检查 | 业务用户是否使用stream或是AQ,不支持8.0-compatible advanced queues with multiple recipients |
基于XMLSchema的XMLType对象检查 | 可能存在bug,10gr2需要使用exp,imp,11gr2使用expdp,impdp |
检查Opaque Types类型字段 | 这些类型对象可以被迁移,但是不会自动转换字节序,需要从程序上修改 |
SPATIAL空间组件对象检查 | 空间索引无法传输 |
是否存在应用户使用TSTZ字段 | 如果数据库版本低于11.2.0.2,目标端和源端的timezone文件版本必须一致 |
检查表空间是否加密 | 无法传输加密的表空间到不同字节序的平台 |
检查是否存在加密字段 | 有某一列加密的表也无法传输到不同字节序的平台 |
BLOCK CHANGE TRACKING 块跟踪是否开启 | 如果需要开启,需要在源端安装补丁,Bug 16850197 |
统计对象 | 各个用户下对象总数,失效对象 |
统计索引 | 各个用户下索引,是否有失效索引 |
统计约束 | 各个用户下约束,是否有失效约束 |
dblink | 如果目标端ip不和源端配置一样,需要在迁移后修改 |
tnsname.ora | 如果目标端ip不和源端配置一样,需要在迁移后修改 |
用户,用户密码,角色,权限,默认表空间,profile | 在进行导入前需要在目标端创建所需用户 |
检查需要迁移的永久表空间 | 查询表空间大小,得到迁移表空间列表 |
2、XTTS基本步骤:
A、将源端数据文件传输到目标系统。
B、转换数据文件为目标系统的字节序。
C、在源端创建增量备份,并传输到目标端。
D、在目标端恢复增量备份。
E、重复多次操作C和D步骤。
F、将源端数据库表空间设置为READ ONLY模式。
G、最后一次执行C和D步骤。
H、在源端导出元数据,并在目标端导入。
I、将目标端的数据库表空间设置为READ WRITE。
3、迁移前准备
1.在目标端安装数据库软件
2.安装源端要求安装数据库(版本、字符集)
3. 上传xtts工具,创建相关目录
上传软件包到源端
[oracle@xiaoai-20_43_13data01]$ mkdir -p /data01/oradata/xtts --创建xtts源端导出目录
[oracle@xiaoai-20_43_13data01]$ mkdir -p /data01/oradata/xtts_back --创建xtts源端导出增量备份目录
-bash-3.00$ mkdir-p /data3/oradata01/dxtts --创建目标端存放从源端传来文件的目录
-bash-3.00$ chown-R oracle:dba /data3/oradata01/
-bash-3.00$ mkdir-p /data3/oradata01/targetdb --创建最后转换完毕,数据库文件存放的位置
-bash-3.00$ mkdir-p /data3/oradata01/dxtts_back --创建目标端转换增量备份的目录
4.进行迁移前检查
检查是否需要安装补丁
需要修改的参数
确认有哪些对象无法迁移需要手工重建
需要提前在目标端创建所需用户
4、初始化迁移
1.设置XTTS的配置文件
[oracle@xiaoai-20_43_13data01]$ vi xtt.properties
tablespaces=TEST0608,TEST0608_B --要导出的表空间
platformid=13 --源端平台号,select* from v$transportable_platform order by platform_id; 查询
srcdir=SOURCEDIR1,SOURCEDIR2 --使用数据泵导入原数据,network_link方式,如果使用imp/exp方式,则不需要该参数)
dstdir=DESTDIR1,DESTDIR2 --使用数据泵导入原数据,network_link方式,如果使用imp/exp方式,则不需要该参数)
srclink=TTSLINK --perl xttdriver.pl -e命令生成impdp迁移脚本使用)
dfcopydir=/data01/oradata/xtts --源端初始化导出目录
backupformat=/data01/oradata/xtts_back --源端导出增量备份目录
stageondest=/data3/oradata01/dxtts --目标端存放从源端传来文件的目录
storageondest=/data3/oradata01/targetdb --最后转换完毕,数据库文件放的位置
backupondest=/data3/oradata01/dxtts_back --目标端转换增量备份的目录
cnvinst_home=/data3/app/oracle/product/10.2.0/db_1 --中转实例和中转实例的家目录
cnvinst_sid=test
parallel=16 --并发数
rollparallel=2 --在目标端应用并发数
注:使用rman方式数据迁移srcdir、dstdir、srclink三个参数不指定,注释
SQL> set linesize 10000;
SQL> col PLATFORM_NAME for a50;
SQL> select * from v$transportable_platform order by platform_id;
PLATFORM_ID PLATFORM_NAME ENDIAN_FORMAT
----------- ----------------------------------------------------------------
1 Solaris[tm] OE(32-bit) Big
2 Solaris[tm] OE(64-bit) Big
3 HP-UX(64-bit) Big
4 HP-UX IA(64-bit) Big
5 HP Tru64 UNIX Little
6 AIX-Based Systems(64-bit) Big
7 Microsoft WindowsIA (32-bit) Little
8 Microsoft WindowsIA (64-bit) Little
9 IBM zSeries BasedLinux Big
10 Linux IA(32-bit) Little
11 Linux IA(64-bit) Little
12 Microsoft Windowsx86 64-bit Little
13 Linux x86 64-bit Little
15 HP Open VMS Little
16 Apple Mac OS Big
17 Solaris OperatingSystem (x86) Little
18 IBM Power BasedLinux Big
19 HP IA OpenVMS Little
20 Solaris OperatingSystem (x86-64) Little
2.源端导出全部数据文件
源端开始导出数据前确认ORACLE_HOME,ORACLE_SID
echo $ORACLE_HOME
echo $ORACLE_SID
export $TMPDIR=/data01/xtts
export TMPDIR=/data01/xtt
export PERL5LIB=$ORACLE_HOME/perl/lib
cd /data3/
$ORACLE_HOME/perl/bin/perl xttdriver.pl -p
此脚本调用的是rman backupcopy功能,会在dfcopydir生成和原文件大小一样的备份文件。
[oracle@xiaoai-20_43_13xtts]$ ll /data01/oradata/xtts
总用量 512024
-rw-r----- 1oracle oinstall 209723392 6月 12 11:22 TEST0608_7.tf
-rw-r----- 1oracle oinstall 314580992 6月 12 11:22 TEST0608_B_8.tf
*** 在源端/data01/xtts目录下生成 rmanconvert.cmd xttplan.txt xttnewdatafiles.txt三个文件 ***
3.复制数据到目标端
要复制$TMPDIRrmanconvert.cmd和dfcopydir 下面所有文件
scp root@10.20.43.13:/data01/xtt/rmanconvert.cmd /data3/xtt
scp root@10.20.43.13:/data01/oradata/xtts/* /data3/oradata01/dxtts
注意:由于本次Oracle用户没有密码,故用root用户,若有Oracle密码或xtt目录建在Oracle家目录下则用Oracle用户
4.目标端转换源端传来的数据文件(字节序转换)
--需要使用11g的rman转换文件
source ~/.bash_profile11g
export $TMPDIR= /data3/xtt
echo $ORACLE_HOME
echo $ORACLE_SID
export TMPDIR= /data3/xtt
export PERL5LIB=$ORACLE_HOME/perl/lib
$ORACLE_HOME/perl/bin/perl xttdriver.pl -c
转换完成后可在storageondest目录下看到所有源端的数据文件,由于缺少表空间元数据所以还无法在目标端数据库查询到这些表空间。
5、生成增量备份
1.源端生成增量份
echo $ORACLE_HOME
echo $ORACLE_SID
export $TMPDIR=/data01/xtts
export TMPDIR=/data01/xtt
export PERL5LIB=$ORACLE_HOME/perl/lib
$ORACLE_HOME/perl/bin/perl xttdriver.pl -i
2.复制产生的增量数据文件到目标端
$TMPDIRxttplan.txt tsbkupmap.txt
backupformat 下面所有文件,或者查看incrbackups.txt
scp `cat $TMPDIR/incrbackups.txt`oracle@10.20.43.13:/data3/oradata01/dxtts
scp oracle@10.20.43.13:/data01/xtt/xttplan.txt /data3/xtt
scp oracle@10.20.43.13:/data01/xtt/tsbkupmap.txt /data3/xtt
3.目标端应用增量备份
source ~/.bash_profile
echo $ORACLE_HOME
echo $ORACLE_SID
export TMPDIR=/data3/xtt
export PERL5LIB=$ORACLE_HOME/perl/lib
cd /data3/xtt
$ORACLE_HOME/perl/bin/perl xttdriver.pl -r
4.源端在下次增量备份前计算SCN
如果还有下次增量备份,需要执行脚本求文件下次增量备份开始的scn
$ORACLE_HOME/perl/bin/perl xttdriver.pl -s
生成的xttplan.txt文件中会记录下次要从哪个scn开始增量备份
为了尽量缩短停机时间,可以多次执行增量备份并应用。
6、执行最后一次增量备份
1.停业务,监听,将表空间设置为只读模式
2.源端执行最后一次增量备份并在目标端应用
--在源端做增量备份
$ORACLE_HOME/perl/bin/perl xttdriver.pl -i
--传输备份文件到目标端
cd $TMPDIR
scp `cat incrbackups.txt`oracle@10.20.43.13:/data3/oradata01/dxtts
--目标端获取增量备份记录文件
scp oracle@10.20.40.13:/data01/xtt/xttplan.txt /data3/xtt
scp oracle@10.20.40.13:/data01/xtt/tsbkupmap.txt /data3/xtt
--目标端应用增量备份
source ~/.bash_profile
echo $ORACLE_HOME
echo $ORACLE_SID
export TMPDIR=/data3/xtt
export PERL5LIB=$ORACLE_HOME/perl/lib
cd /data3/xtt
pwd
$ORACLE_HOME/perl/bin/perl xttdriver.pl -r
7、传输表空间
传输表空间的步骤可以和最后一次增量备份同时执行,可开并行
方法1:
--目标端执行,得到impdp脚本
$ORACLE_HOME/perl/bin/perl xttdriver.pl –e
impdp \'/ as sysdba\' directory=ddmp logfile=impdp_xtts_20180527.lognetwork_link=TEST \
transport_full_check=no \
transport_tablespaces=TEST,TEST_IND \
transport_datafiles='/data3/oradata/targetdb/TEST_5.dbf','/data3/oradata/targetdb/TEST_IND_6.dbf'
方法2:
--手工导出导入表空间
源端
expdp \'/ as sysdba\' directory=sdmp dumpfile=xtts.dmplogfile=expdp_xtts_20180527.log transport_tablespaces=TEST,TEST_INDtransport_full_check=no;
复制导出的文件到目标端
目标端
impdp \'/ as sysdba\' directory=ddmp dumpfile=xtts.dmplogfile=impdp_xtts_20180527.logtransport_datafiles='/app/oradata/targetdb/TEST_5.dbf,/app/oradata/targetdb/TEST_IND_6.dbf'
--验证,传输完成后应该能够看到所有表空间,并且能够查询其中的数据
set pagesize 2000
set linesize 200
col file_name for a40
col OBJECT_NAME for a30
select TABLESPACE_NAME from dba_tablespaces;
8、导入元数据
源端导出,如果不对数据字典做任何修改操作,可提前导出,可开并行
expdp system/oracle DIRECTORY=sdmp LOGFILE=dp_fullexp_meta.logDUMPFILE=dp_full.dmp FULL=y CONTENT=METADATA_ONLY
复制导出的文件到目标端
目标端导入
impdp system/oracle DIRECTORY=ddmp LOGFILE=dp_fullexp_meta.logDUMPFILE=dp_full.dmp FULL=y CONTENT=METADATA_ONLY
将目标端表空间设为可读写状态