【DB宝53】Oracle异构平台迁移利器之XTTS(使用dbms_file_transfer方式)

2021-05-27 10:15:07 浏览数 (1)

姊妹篇文章:【DB宝52】Oracle异构平台迁移利器之XTTS(使用rman方式)

目录

代码语言:javascript复制
一、XTTS简介
  1.1、简介
  1.2、全量迁移方式
  1.3、脚本rman_xttconvert_v3.zip
    1.3.1、xttdriver.pl的选项
    1.3.2、xtt.properties参数
    1.3.3、文件介绍
  1.4、参考文档
  1.5、迁移过程导图
二、XTTS迁移示例
  2.1、数据库检查
    2.1.1、查询平台字节序和字符集
    2.1.2、获取需要迁移的业务表空间和业务用户
    2.1.3、表空间自包含
    2.1.4、获取用户及其权限的SQL
    2.1.5、检查环境变量
    2.1.6、开启块改变跟踪功能
    2.1.7、时区需要一致
    2.1.8、目标端补丁情况
    2.1.9、组件检查
    2.1.10、目标端的db_files参数不能小于源端
    2.1.11、迁移对象个数统计
  2.2、全量迁移
    2.2.1、源端和目标端都需要配置XTTS脚本
    2.2.2、创建相关directories和dblink
      1、源端创建SOURCEDIR:
      2、目标端创建DESTDIR:
      3、目标端创建DBLINK
    2.2.3、xttdriver.pl -S做迁移准备
    2.2.4、将源端xttnewdatafiles.txt和getfile.sql传到目标端
    2.2.5、在目标端执行数据文件的拷贝
  2.3、XTTS  第1~n次增量前滚
    2.3.1、产生增量数据
    2.3.2、源端做增量备份
    2.3.3、将源端的增量数据传到目标端
    2.3.4、目标端进行增量转换和数据写入同步
    2.3.5、源端确定下一个增量备份的FROM_SCN
  2.4、XTTS  最后一次增量前滚
    2.4.1、将表空间置为RO状态
    2.4.2、源端做增量备份
    2.4.3、将源端的增量数据传到目标端
    2.4.4、目标端进行增量转换和数据写入同步
  2.5、迁移元数据
    2.5.1、在目标库创建业务用户
    2.5.2、导入xtts的元数据
    2.5.3、导入存储过程、触发器、函数、包、视图、序列
    2.5.4、导入公共同义词和dblink等其它对象
  2.6、迁移完成后的收尾工作
    2.6.1、查看源端、目标端的数据一致性
    2.6.2、更改用户默认表空间
    2.6.3、目标库的表空间修改为读写模式
    2.6.4、校验数据文件完整性
    2.6.5、收集统计信息
  2.7、总结

一、XTTS简介

1.1、简介

XTTS(Cross Platform Transportable Tablespaces)属于跨平台迁移表空间,它是从Oracle 8i开始就引入的一种基于表空间传输的物理迁移方法,命名为TTS,经历各个版本的不断演进,从11gR2开始,在相对停机时间要求日益减少的情况,为了应对越来越大的数据量跨平台迁移,Oracle推出了新的解决方案—加强版TTS(以下简称XTTS),XTTS使用增量备份的方式实现跨平台的数据迁移,从真正意义上大大缩短停机时间。在U2L如火如荼的今天,通过XTTS快捷、高效、平稳、安全的将Oracle数据库“小型机 集中式存储”环境迁移至“X86架构平台 分布式存储”已然成为一大神技。

XTTS的发展历史:

  • 从8i,tts技术的诞生,引入了相同平台相同块大小之间的表空间传输。到了9i,tts开始支持同平台中,不同块大小的表空间传输。
  • 10g时代,不仅引入了跨平台的表空间传输方案,也就是我们说的xtts;10gR2开始支持传输整个数据库。
  • 11gR1开始,可以传输表空间中的某个特定分区。
  • 在11.2.0.4开始,为了应对越来越大的数据量,而停机时间甚至还在减少的情况,出现了新的解决方案—使用增量备份方式的xtts。

XTTS 各版本的功能比对如下:

在 Oracle11gR2(推荐使用 11.2.0.4 及之后版本)以后,Oracle 推出了通过前滚数据文件,拷贝数据后再进行多次增量备份的 XTTS 来完成迁移过程,在这个过程中通过开启块跟踪特性,根据 SCN 号来执行一系列的增量备份,并且通过对块跟踪文件的扫描,来完成增量数据的增量备份应用,最后在通过一定的停机时间,在源库 read only 的状态下进行最后一次增量备份转换应用,使得整个迁移过程的停机时间同源库数据块的变化率成正比。这样大大的缩短了停机时间。

为了减少正式的停机时间,oracle在xtts中引入了rman的增量备份前滚功能。通过一次又一次的增量备份,使停应用的时间主要包含四个方面:将表空间置为只读,最后进行一次增量前滚,元数据导入,数据文件校验。和传统的表空间传输相比,通过减少数据文件的传输时间,而大大减少了整体停机时间。

1.2、全量迁移方式

对于XTTS的全量操作,Oracle提供了2种方式来进行,分别如下: 1)dbms_file_transfer(DFT) -- (using xttdriver.pl -S and -G options)

DBMS_FILE_TRANSFER 包是 Oracle 提供的一个用于复制二进制数据库文件或在数据库之间传输二进制文件的程序包,在 XTTS 迁移中,利用不同的参数进行数据文件传输转换完成迁移。

要求:目标端数据库版本必须是11.2.0.4以及更新的版本。如果数据库版本低于11.2.0.4(大于Oracle10R1),那么目标端环境,仍然需要安装11.2.0.4以及更新版本的临时环境,因为XTTS增量的核心脚本功能必须是基于11.2.0.4( )版本。

如果准备使用DDBMS_FILE_TRANSFER 作为全量迁移方法,那么必须创建三个数据库对象:

  1. 源数据库中的数据库目录对象。
  2. 目标数据库中的数据库目录对象,放置数据文件的位置。
  3. 在目标数据库中创建指向源库的数据库链接。

2)RMAN(Recovery Manager )备份 -- (using xttdriver.pl -p and -c options)

通过使用 rman-xttconvert 包提供的参数,对数据库进行基于表空间的备份,将备份产生的备份集写到本地或者 NFS 盘上,然后再通过 rman-xttconvert 包中包含的不同平台之间数据文件格式转换的包对进行数据文件格式转换,最后通过记录的表空间 FILE_ID 号生产元数据的导入脚本,通过 db_link 执行完成。

1.3、脚本rman_xttconvert_v3.zip

XTTS基于一组 rman-xttconvert_3.0 的脚本文件包(Mos 1389592.1)来实现跨平台的数据迁移,主要包含 Perl脚本xttdriver 脚本。xttdriver.pl 是备份、转换和增量应用的执行脚本,xtt.properties 是属性文件,其中包含 XTTS 配置的路径、参数等。

脚本下载地址:11G - Reduce Transportable Tablespace Downtime using Cross Platform Incremental Backup (Doc ID 1389592.1),内容参考:http://blog.itpub.net/26736162/viewspace-2767429/

脚本rman_xttconvert_v3.zip在小麦苗的微云下载:https://share.weiyun.com/57HUxNi,路径:小麦苗分享的资料>数据库系列>Oracle数据库>Oracle工具。

1.3.1、xttdriver.pl的选项

1.3.2、xtt.properties参数

1.3.3、文件介绍

  • xttplan.txt - containing the tablespace names, their current SCNs and their datafile numbers
  • xttnewdatafiles.txt - containing the tablespace names, datafile numbers, the destination directory object name and the source filenames
  • getfile.sql - The PL/SQL script(formatting ours) that will be used at the destination to get the datafilesfrom the source
  • xttpreparesrc.sql - the PL/SQL scriptused to create the files in this step
  • xttprepareNaNd - the command
  • tsbkupmap.txt - containing the tablespace names, datafile numbers and the incremental backup pieces
  • incrbackups.txt - containing the actual location of the incremental backup pieces
  • rmanincrNaNd - containing the RMAN scripts used to create the incremental backups.
  • xttdetnewfromscnsrc.sql - the PL/SQLscript used to create the files in this step
  • xttplan.txt.new- after the first run of'xttdriver.pl -i' this is just a copy of the xttplan.txt

1.4、参考文档

  • 11G - Reduce Transportable Tablespace Downtime using Cross Platform Incremental Backup (文档 ID 1389592.1)
  • 12c – 使用跨平台增量备份来减少传输表空间的停机时间 (文档 ID 2102859.1)
  • 12C - Reduce Transportable Tablespace Downtime using Cross Platform Incremental Backup (文档 ID 2005729.1)

http://blog.itpub.net/26736162/viewspace-2767646/

http://blog.itpub.net/26736162/viewspace-2767429/

1.5、迁移过程导图

二、XTTS迁移示例

环境情况如下:

源库

目标库

版本

11.2.0.3

11.2.0.4

ORACLE_SID

LHR11G

LHR11G

用户表空间

TS_LHR、TS_XXT、USERS

TS_LHR、TS_XXT、USERS

业务用户

lhr、xxt

lhr、xxt

平台

Linux x86 64-bit

Linux x86 64-bit

字节序

Little

Little

IP地址

172.17.0.3

172.17.0.4

字符集

AMERICAN_CHINA.AL32UTF8

AMERICAN_CHINA.AL32UTF8

归档模式

归档模式

归档模式

注:虽然我这里使用的同构平台,但是异构平台下的步骤是一样的,例如从Aix到Linux,该过程完全适用。

2.1、数据库检查

  • 源库必须为归档模式
  • 源端和目标的字符集需要一致
  • 源库的操作系统不是Windows
  • 源库的compatible参数最低为11.1.0.0.0
  • 源库的RMAN 配置里DEVICE TYPE DISK不能设置为COMPRESSED
  • 源端和目标端必须支持可传输平台
  • 源端需要迁移的表空间需要自包含
  • 源库开启块改变跟踪功能,加快增量备份的速度
  • 源端和目标端时区需要保持一致
  • 目标端建议打最新的PSU补丁
  • 目标端的db_files参数不能小于源端
  • 要迁移的表空间的数据文件必须都是online或者不包含offline的数据文件
  • 检查源数据库和目标库具有重名的表空间
  • 检查是否存在应用用户建在system,sysaux,users上的情况
  • 基于XMLSchema的XMLType对象检查
  • 失效对象检查
  • 迁移对象统计
  • 无论是源还是目标,GLOGIN.sql的存在都可能导致语法错误
  • 源库的版本不能大于目标库的版本

2.1.1、查询平台字节序和字符集

代码语言:javascript复制
-- 查询平台和字节序
col PLATFORM_NAME format a30
SELECT d.PLATFORM_ID,d.PLATFORM_NAME, tp.ENDIAN_FORMAT
     FROM V$TRANSPORTABLE_PLATFORM tp, V$DATABASE d
     WHERE tp.PLATFORM_NAME = d.PLATFORM_NAME;

-- 查询字符集
select userenv('language') from dual;

2.1.2、获取需要迁移的业务表空间和业务用户

排除系统表空间,避免冲突:

代码语言:javascript复制
select TABLESPACE_NAME,BLOCK_SIZE,CONTENTS,STATUS
from dba_tablespaces
where tablespace_name not in ('SYSTEM','SYSAUX','UNDOTBS1','TEMP','EXAMPLE');


select owner,tablespace_name,count(*)
from dba_segments 
where  tablespace_name not in ('SYSTEM','SYSAUX','UNDOTBS1','TEMP','EXAMPLE')
group by owner,tablespace_name order by tablespace_name;

目标端需要删除已存在的和源库同名的表空间:

代码语言:javascript复制
drop tablespace users including contents and datafiles;
drop tablespace ts_lhr including contents and datafiles;
drop tablespace ts_xxt including contents and datafiles;

select tablespace_name,status from dba_tablespaces;

2.1.3、表空间自包含

需要传输的表空间为TS_LHR、TS_XXT、USERS,要确保这3个表空间为自包含的表空间。

代码语言:javascript复制
-- 自包含检查
exec dbms_tts.transport_set_check('TS_LHR,TS_XXT,USERS',true);

-- 查看结果,结果为空,表示为自包含
col violations for a70
select * from transport_set_violations;

在表空间传输的中,要求表空间集为自包含的,自包含表示用于传输的内部表空间集没有引用指向外部表空间集。

2.1.4、获取用户及其权限的SQL

代码语言:javascript复制
SET LONG 9999
SELECT DBMS_METADATA.GET_DDL('USER', USERNAME) DDL_SQL FROM DBA_USERS 
WHERE USERNAME IN (select owner  from dba_segments 
where  tablespace_name not in ('SYSTEM','SYSAUX','UNDOTBS1','TEMP','EXAMPLE') 
group by owner,tablespace_name) AND USERNAME NOT IN ('SYS');


SELECT DBMS_METADATA.GET_GRANTED_DDL('SYSTEM_GRANT', USERNAME) DDL_SQL FROM DBA_USERS 
WHERE USERNAME IN (select owner  from dba_segments 
where  tablespace_name not in ('SYSTEM','SYSAUX','UNDOTBS1','TEMP','EXAMPLE') 
group by owner,tablespace_name) AND USERNAME NOT IN ('SYS');


SELECT DBMS_METADATA.GET_GRANTED_DDL('ROLE_GRANT', USERNAME) DDL_SQL FROM DBA_USERS 
WHERE USERNAME IN (select owner  from dba_segments 
where  tablespace_name not in ('SYSTEM','SYSAUX','UNDOTBS1','TEMP','EXAMPLE') 
group by owner,tablespace_name) AND USERNAME NOT IN ('SYS');



SELECT DBMS_METADATA.GET_GRANTED_DDL('OBJECT_GRANT', USERNAME) DDL_SQL FROM DBA_USERS 
WHERE USERNAME IN (select owner  from dba_segments 
where  tablespace_name not in ('SYSTEM','SYSAUX','UNDOTBS1','TEMP','EXAMPLE') 
group by owner,tablespace_name) AND USERNAME NOT IN ('SYS');

2.1.5、检查环境变量

确保环境变量配置正确:

代码语言:javascript复制
env | egrep "ORACLE_SID|ORACLE_HOME"

结果:

代码语言:javascript复制
[oracle@lhrora11204 ~]$ env | egrep "ORACLE_SID|ORACLE_HOME"
ORACLE_SID=LHR11G
ORACLE_HOME=/u01/app/oracle/product/11.2.0.4/dbhome_1

2.1.6、开启块改变跟踪功能

Block change tracking 进程记录自从上一次0级备份以来数据块的变化,并把这些信息记录在跟踪文件中。RMAN 使用这个文件判断增量备份中需要备份的变更数据。这极大的提高了备份性能和速度,RMAN 可以不再扫描整个文件以查找变更数据。

代码语言:javascript复制
ALTER DATABASE ENABLE BLOCK CHANGE TRACKING USING  FILE '/u01/app/oracle/changetracking.chg';

col filename format a100
select status, filename from v$block_change_tracking;

2.1.7、时区需要一致

代码语言:javascript复制
select dbtimezone from dual;

2.1.8、目标端补丁情况

建议目标端打最新的PSU补丁。

代码语言:javascript复制
SELECT * FROM dba_registry_history;

2.1.9、组件检查

目标端需要包含源端的所有组件。

代码语言:javascript复制
select comp_id,comp_name,version,status from dba_registry;

2.1.10、目标端的db_files参数不能小于源端

代码语言:javascript复制
show parameter db_files

2.1.11、迁移对象个数统计

需要确认,非业务用户下是否有业务数据,例如SYS用户是否有业务数据:

代码语言:javascript复制
-- 需要迁移的对象和数量
select owner, object_type, count(*)
 from dba_objects
where object_name not like 'BIN%'
 and owner in ('LHR','XXT')
group by owner, object_type
order by 1,2 desc;

-- 无效对象
select owner, object_type, count(*)
 from dba_objects
where status <> 'VALID'
 and owner in ('LHR','XXT')
group by owner, object_type
order by 1, 2 desc;




-- 非业务用户下是否有业务数据
SELECT *
  FROM dba_objects d
 where d.created >= sysdate - 10
   and d.object_name not like 'WR%' 
     and d.owner IN ('SYS','SYSTEM')
 order by d.created desc;

执行过程:

代码语言:javascript复制
SYS@LHR11G> select owner, object_type, count(*)
  2   from dba_objects
  3  where object_name not like 'BIN%'
 and owner in ('LHR','XXT')
group by owner, object_type
  6  order by 1,2 desc;

OWNER                                                        OBJECT_TYPE                              COUNT(*)
------------------------------------------------------------ -------------------------------------- ----------
LHR                                                          VIEW                                            1
LHR                                                          TABLE                                           9
LHR                                                          SYNONYM                                         1
LHR                                                          SEQUENCE                                        1
LHR                                                          PROCEDURE                                       2
XXT                                                          TABLE                                           2

6 rows selected.

SYS@LHR11G> 
SYS@LHR11G> select owner, object_type, count(*)
  2   from dba_objects
where status <> 'VALID'
 and owner in ('LHR','XXT')
group by owner, object_type
  6  order by 1, 2 desc;

OWNER                                                        OBJECT_TYPE                              COUNT(*)
------------------------------------------------------------ -------------------------------------- ----------
LHR                                                          PROCEDURE                                       1

2.2、全量迁移

在此步骤中,表空间的数据文件将从源端数据库传输到目标端数据库,本步骤只需要执行一次,数据文件传输过程中不影响源端数据库正常访问。

此处有2种方法:dbms_file_transfer和rman方法。对于数据文件很多的情况下来说,dbms_file_transfer是推荐的方法。

此处使用dbms_file_transfer方式。

2.2.1、源端和目标端都需要配置XTTS脚本

代码语言:javascript复制
rm -rf /u01/app/xtts/
rm -rf /home/oracle/scripts

mkdir -p /u01/app/xtts/inc_bk*
mkdir -p /u01/app/xtts/df_bk

mkdir -p /home/oracle/scripts
cd /home/oracle/scripts

cp ~/rman_xttconvert_v3.zip /home/oracle/scripts
unzip rman_xttconvert_v3.zip


-- 注意修改相应参数
cat > /home/oracle/scripts/xtt.properties  <<"EOF"
tablespaces=TS_LHR,TS_XXT,USERS
platformid=13
srcdir=SOURCEDIR
dstdir=DESTDIR
srclink=ttslink
#dfcopydir=/u01/app/xtts/df_bk
backupformat=/u01/app/xtts/inc_bk
stageondest=/u01/app/xtts/df_bk
storageondest=/u01/app/oracle/oradata/LHR11G
backupondest=/u01/app/xtts/inc_bk
#cnvinst_home=/oracle/app/oracle/product/11.2.0/dbhome_1
#cnvinst_sid=targetdb
EOF

2.2.2、创建相关directories和dblink

1、源端创建SOURCEDIR:
代码语言:javascript复制
create directory sourcedir as '/u01/app/oracle/oradata/LHR11G/';
grant all on directory sourcedir to public;
2、目标端创建DESTDIR:
代码语言:javascript复制
create directory DESTDIR as '/u01/app/oracle/oradata/LHR11G/';
grant all on directory DESTDIR to public;
3、目标端创建DBLINK

在目标端创建指向源端的dblink:

代码语言:javascript复制
create public database link ttslink connect to system identified by lhr using '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.17.0.3 )(PORT = 1521))  ) (CONNECT_DATA = (SERVICE_NAME = LHR11G) ) )';

2.2.3、xttdriver.pl -S做迁移准备

首先,确保源库处于OPEN阶段,所有表空间都处于online状态:

代码语言:javascript复制
select 'ALTER TABLESPACE '||name||' READ WRITE;' exec_sql
from v$tablespace 
where NAME not in ('SYSTEM','SYSAUX','UNDOTBS1','TEMP');


select tablespace_name,status from dba_tablespaces;

在源端执行 xttdriver.pl -p做迁移准备:

代码语言:javascript复制
cd /home/oracle/scripts
export TMPDIR=/home/oracle/scripts
$ORACLE_HOME/perl/bin/perl xttdriver.pl -S

此过程会产生2个脚本,xttnewdatafiles.txt和getfile.sql

代码语言:javascript复制
[oracle@lhrora11203 scripts]$ cat getfile.sql
0,SOURCEDIR,ts_lhr01.dbf,DESTDIR,ts_lhr01.dbf
1,SOURCEDIR,ts_xxt01.dbf,DESTDIR,ts_xxt01.dbf
2,SOURCEDIR,users01.dbf,DESTDIR,users01.dbf
[oracle@lhrora11203 scripts]$ cat xttnewdatafiles.txt
::TS_LHR
6,DESTDIR:/ts_lhr01.dbf
::TS_XXT
7,DESTDIR:/ts_xxt01.dbf
::USERS
4,DESTDIR:/users01.dbf

2.2.4、将源端xttnewdatafiles.txt和getfile.sql传到目标端

0 人点赞