概览
数据库平台迁移是企业数据库运维时的常见场景。常用方法及优缺点如下:
本文针对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-
领取专属 10元无门槛券
私享最新 技术干货