暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

Oracle数据库跨平台迁移方案-XTTS

应用DBA 2021-04-21
2163

概览

 

数据库平台迁移是企业数据库运维时的常见场景。常用方法及优缺点如下:

 

方法

优点

缺点

RMAN

操作简单

不适用于不同字节序之间的平台迁移

数据泵

操作简单

数据量大时需要的停机时间很长

OGG

对源端目标端平台无要求

操作较复杂,维护成本高

XTTS

源端与目标端字节序可以不同,停机时间短。

被移动的表空间不能包含offline的数据文件

 

本文针对XTTS方案进行简单介绍。

 



蓝色斜体字需要根据各自环境修改

 

1        环境准备

 

1.1 检查要迁移的表空间是否自包含

EXECUTEDBMS_TTS.TRANSPORT_SET_CHECK('TABLESPACE1,TABLESPACE2',TRUE);

select * fromtransport_set_violations;

 

1.2 在源端创建dba权限用户

create user xttsidentified by xtts default tablespace users;

grant dba to xtts;

 

1.3 检查迁移用户是否使用系统表空间

select distinct owner,tablespace_name,segment_name from dba_segments where owner in ('USERNAME1', 'USERNAME2') and tablespace_name in ('SYSAUX', 'SYSTEM','USERS')order by owner;

 

1.4 查找迁移用户对应的表空间,如果用户对象有在系统表空间,需要迁移至用户表空间

select distinct owner,tablespace_name from dba_tables where owner in ('USERNAME1','USERNAME2');

 

1.5 将迁移用户导入到目标环境,注意这一步只导用户,不涉及到用户对象。如果用户少,可以直接在目标端使用create user来创建用户。

expdp system/oracledumpfile=users.dmp logfile=users.log schemas=USERNAME1,USERNAME2 include=usersdirectory=DUMP

拷贝users.dmp至目标端

目标端执行:

impdp system/oracle dumpfile=users.dmp logfile=impusers.log directory=DUMP

 

1.6 获取迁移用户临时表结构,表空间传输步骤中需要手工创建临时表。如果表比较多,可以采用expdp/impdp导入。

selectowner,table_name from dba_tables where owner in ('USERNAME1', 'USERNAME2')and temporary='Y';

selectdbms_metadata.get_ddl('TABLE','tablename','owner')from dual;

 

1.7 查询指向数据库迁移用户对象的全局同义词和public db link,需要在最后手工创建。

selectowner,synonym_name,table_owner,table_name from dba_synonyms where table_owner in ('USERNAME1', 'USERNAME2') ;

select * fromdba_db_links;

 

1.8 开启源端block change tracking

select * from v$block_change_tracking;

alter database enable block change tracking using file '+DATA01/block_change_tracking.log';

 

1.9 创建源端和目标端的xtts目录,并将xtts脚本解压到目录中

cd oracle/app/db

mkdir xttsdir

cd xttsdir

unziprman-xttconvert_3.0.zip ##zip文件可以在MOSID 1389592.1中下载

 

1.10 创建源端和目标端directory,路径为datafile所在路径。如果所有datafile都在同一路径下,每个环节只需创建一个directory。如果为多个路径,则需要将所有路径都创建。

源端:

create directory SOURCE_XTTSDIR1 as '+DATA01/XXXX1';

create directory SOURCE_XTTSDIR2 as '+DATA01/XXXX2';

目标端:

create directory TARGET_XTTSDIR1 as '+DATA01/XXXX';

 

1.11 配置目标端至源端的TNS别名

TNS_XXXX=

        (DESCRIPTION=

            (ADDRESS_LIST=

                (LOAD_BALANCE=YES)

                (FAILOVER=YES)

                (ADDRESS=(PROTOCOL=tcp)(HOST=xx.xx.xx.xx)(PORT=xxxx))

                (ADDRESS=(PROTOCOL=tcp)(HOST=xx.xx.xx.xx)(PORT=xxxx))

            )

            (CONNECT_DATA=

                (SERVICE_NAME=xxxx)

            )

 

1.12 在目标端创建指向源端xtts用户的dblink

create public database link xtts_dblink connect to xtts identified by "xtts" using' TNS_XXXX ';

 

1.13 修改源端和目标端xtts配置文件xtt.properties

vi oracle/app/db/xtts/xtt.properties

tablespaces= TABLESPACE1,TABLESPACE2 # Comma separated list oftablespaces to transport from source database to destination database

platformid=6 # Source database platform id, obtained from V$DATABASE.PLATFORM_ID

srcdir= SOURCE_XTTSDIR1,SOURCE_XTTSDIR2 #1.10步骤中创建的directory

dstdir= TARGET_XTTSDIR1 #1.10步骤中创建的directory

srclink= xtts_dblink #1.11步骤中创建的dblink名称

backupformat= /backup/uat_stage_source #源库增量备份存储目录

stageondest= /backup/uat_stage_source #目标库增量备份存储目录

backupondest= /backup/uat_stage_dest #目标库增量备份转换后存储目录

parallel=4

rollparallel=2

getfileparallel=4

 

注意此处,我的环境中/backup目录为源端和目标端共享的NFS挂载路径,且参数中backupformatstageondest设置为相同路径,这样就不需要将增量备份内容从源端拷贝到目标端了。如果你的环境中没有挂载NFS,后面步骤中需要拷贝增量备份内容,且参数按照你的环境来设置。

 

 

2        Prepare Phase

2.1 设置环境变量TMPDIR指向当前xtts所在路径(源端、目标端)

export TMPDIR=/oracle/app/db/xttsdir

 

2.2 源端开启debug模式

export XTTDEBUG=1

 

2.3 源端执行脚本

$ORACLE_HOME/perl/bin/perl xttdriver.pl -S

 

该脚本会做以下两个动作:

  • 检查所需迁移的表空间是否online,是否为READWRITE模式,并且不包括offline的数据文件;

  • 生成xttnewdatafiles.txtgetfile.sql两个文件

 

2.4 复制源端生成的文件xttnewdatafiles.txtgetfile.sql至目标环境。

 

2.5 目标环境上执行命令拷贝源端数据文件至目标端。如果数据量较大,执行时间会很长,建议放后台执行。

$ORACLE_HOME/perl/bin/perl xttdriver.pl -G

 

如果脚本失败,需要删除/oracle/app/db/xttsdir/FAILED文件再执行,否则会报错。

另外,如果是脚本执行过程中报错,重新跑脚本时会报文件已存在的错误,可以尝试注释掉xttdriver.pl3886checkErrFile()

 

3        Roll Forward Phase

步骤3.1-3.4为应用增量,可重复执行

3.1 在源端执行以下命令:

$ORACLE_HOME/perl/bin/perl xttdriver.pl -i

该命令会执行RMAN脚本产生所需迁移表空间的增量备份,且生成tsbkupmap.txtincrbackups.txt两个文件。

 

3.2 拷贝源端产生的incrbackups.txt文件中列出的增量备份文件到目标库stageondest目录。如果用的是共享的NFS,则此步骤省略。

 

3.3 拷贝上一步骤中生成的文件tsbkupmap.txtincrbackups.txt至目标端,并应用datafilecopies至目标端。

$ORACLE_HOME/perl/bin/perl xttdriver.pl -r

 

3.4 更新FROM_SCN标识,以便下一次增量时能够正确产生增量数据。

$ORACLE_HOME/perl/bin/perl xttdriver.pl -s

该命令确定新的FROM_SCN,然后记录到xttplan.txt。再次创建增量备份时,从该SCN号开始。

 

4        Transport Phase


此步骤开始需要停业务。

停应用,kill应用进程,切日志alter system switch logfile

 

4.1 设置源端被迁移的表空间为read only

alter tablespace TABLESPACE1read only;

alter tablespace TABLESPACE2 readonly;

 

4.2源端进行最后一次增量备份

$ORACLE_HOME/perl/bin/perl xttdriver.pl -i

 

4.3 将源端生成的增量文件传到目标数据库端

  • Ÿ  检查增量文件内容(more incrbackups.txt

  • Ÿ  拷贝增量文件至目标端(如果用的是共享的NFS,则此步骤省略)

  • Ÿ  拷贝xttplan.txttsbkupmap.txt两个文件至目标端xtts目录下

 

4.4 应用datafile copies至目标端

$ORACLE_HOME/perl/bin/perl xttdriver.pl -r

 

4.5 目标端导入数据库元数据

在目标端,执行以下命令产生xttplugin.txt导入文件

perl xttdriver.pl -e

修改xttplugin.txt文件DIRECTORYLOGFILE,以及NETWORK_LINK三个参数,并增加导入用户及密码和“exclude=TABLE_STATISTICS”,增加执行权限后执行导入操作

 

vi xttplugin.txt

impdp system/oracle directory=DATA_PUMP_DIRlogfile=imp.log \

network_link=XTTS_DBLINKtransport_full_check=no \

exclude=TABLE_STATISTICS \

 

chmod +x xttplugin.txt

./xttplugin.txt

 

4.6 根据步骤1.6中生成的临时表脚本,在目标端新建全局临时表

4.7 导入其它对象

impdp system/oracle directory=DATA_PUMP_DIRlogfile=imp2.log network_link=XTTS_DBLINK SCHEMAS=USERNAME1,USERNAME2 CONTENT=METADATA_ONLYEXCLUDE=TABLE,INDEX,CONSTRAINT parallel=8

 

4.8 目标端新建全局同义词和public db link(已在步骤1.7列出需要创建的同义词和dblink

 

4.9 在目标端将传输表空间改为readwirte

alter tablespace TABLESPACE1read write;

alter tablespace TABLESPACE2read write;

 

4.10 验证表空间物理块及逻辑块是否有损坏

rman target/

RMAN> validate tablespace TABLESPACE1,TABLESPACE2 check logical; 

 

4.11 收集统计信息

execdbms_stats.gather_database_stats(estimate_percent=>10,degree=>8,cascade=>true,granularity=>'ALL');  



-END-




文章转载自应用DBA,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论