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

概览

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

本文针对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,USERNAME2include=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)

)

(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挂载路径,且参数中backupformat和stageondest设置为相同路径,这样就不需要将增量备份内容从源端拷贝到目标端了。如果你的环境中没有挂载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.txt、getfile.sql两个文件

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

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

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

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

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

3 Roll Forward Phase

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

3.1在源端执行以下命令:

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

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

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

3.3拷贝上一步骤中生成的文件tsbkupmap.txt、incrbackups.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号开始。

4Transport Phase

此步骤开始需要停业务。

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

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

alter tablespaceTABLESPACE1read only;

alter tablespaceTABLESPACE2readonly;

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

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

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

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

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

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

4.4应用datafile copies至目标端

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

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

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

perl xttdriver.pl -e

修改xttplugin.txt文件DIRECTORY,LOGFILE,以及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 tablespaceTABLESPACE1read write;

alter tablespaceTABLESPACE2read write;

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

rman target/

RMAN> validate tablespaceTABLESPACE1,TABLESPACE2check logical;

4.11收集统计信息

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

-END-

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180409G18PZ000?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券