合 使用XTTS异机迁移并升级11.2.0.4到12.2.0.1
Tags: Oracle数据迁移升级XTTS异机升级异机迁移
- 环境
- 1、数据库检查
- 查询平台字节序和字符集
- 获取需要迁移的业务表空间和业务用户
- 表空间自包含
- 获取用户及其权限的SQL
- 检查环境变量
- 开启块改变跟踪功能
- 时区需要一致
- 目标端补丁情况
- 组件检查
- 目标端的db_files参数不能小于源端
- 迁移对象个数统计
- 2、全量迁移
- 方法2A.1、源端和目标端都需要配置XTTS脚本
- 2A.2、创建相关directories和dblink
- 源端创建SOURCEDIR:
- 目标端创建DESTDIR:
- 目标端创建DBLINK
- 2A.3、xttdriver.pl -S做迁移准备
- 2A.4、将源端xttnewdatafiles.txt和getfile.sql传到目标端
- 2A.5、在目标端执行数据文件的拷贝(全量迁移)
- 方法2B.1、源端和目标端都需要配置XTTS脚本
- 2B.2、源端调用 xttdriver.pl -p做迁移准备
- 2B.3、将源端的数据文件副本和rmanconvert.cmd传到目标端
- 2B.4、在目标端对数据文件拷贝进行字节序的转换
- 3、XTTS 增量前滚
- 1、将表空间置为RO状态(最后一次增量)
- 2、源端做增量备份
- 3、将源端的增量数据传到目标端
- 4、目标端进行增量转换和数据写入同步
- 5、源端确定下一个增量备份的FROM_SCN
- 4、迁移元数据
- 在目标库创建业务用户
- 方法一:利用network_link直接导入
- 方法二:手动导出和导入
- 1、源端导出要迁移的表空间的 Metadata
- 2、目标库导入元数据
- 5、迁移完成后的收尾工作
- 查看源端、目标端的数据一致性
- 更改用户默认表空间
- 源库与目标库的表空间读写模式
- 校验数据文件完整性
- 收集统计信息
- 6、总结
相关文章可以参考:
【DB宝53】Oracle异构平台迁移利器之XTTS(使用dbms_file_transfer方式):https://www.dbaup.com/dbbao53oracleyigoupingtaiqianyiliqizhixttsshiyongdbms_file_transferfangshi.html
【DB宝52】Oracle异构平台迁移利器之XTTS(使用rman方式):https://www.dbaup.com/dbbao52oracleyigoupingtaiqianyiliqizhixttsshiyongrmanfangshi.html
环境
环境情况如下:
源库 | 目标库 | |
---|---|---|
版本 | 11.2.0.4 | 12.2.0.1 |
ORACLE_SID | LHR11G | LHR11G |
用户表空间 | TS_LHR、USERS | TS_LHR、USERS |
业务用户 | lhr、scott | lhr、scott |
平台 | Linux x86 64-bit | Linux x86 64-bit |
字节序 | Little | Little |
IP地址 | 172.17.0.2 | 172.17.0.4 |
字符集 | AMERICAN_CHINA.AL32UTF8 | AMERICAN_CHINA.AL32UTF8 |
归档模式 | 归档模式 | 归档模式 |
XTTS迁移流程:
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的存在都可能导致语法错误
- 源库的版本不能大于目标库的版本
查询平台字节序和字符集
1 2 3 4 5 6 7 8 | -- 查询平台和字节序 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; |
获取需要迁移的业务表空间和业务用户
排除系统表空间,避免冲突,并且检查业务表空间是否存在自包含
1 2 3 4 5 6 7 8 9 10 | 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; |
目标端需要删除已存在的和源库同名的表空间:
1 2 3 4 5 6 7 8 9 10 11 12 13 | drop user sh cascade; drop user hr cascade; drop user oe cascade; drop user IX CASCADE; alter database default tablespace sysaux; drop tablespace example including contents and datafiles; 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; |
表空间自包含
需要传输的表空间为TS_LHR、TS_XXT、USERS,要确保这3个表空间为自包含的表空间。
1 2 3 4 5 6 7 | -- 自包含检查 exec dbms_tts.transport_set_check('TS_LHR,TS_XXT,USERS',true); -- 查看结果,结果为空,表示为自包含 col violations for a70 select * from transport_set_violations; |
在表空间传输的中,要求表空间集为自包含的,自包含表示用于传输的内部表空间集没有引用指向外部表空间集。自包含分为两种:一般自包含表空间集和完全(严格)自包含表空间集。
常见的以下情况是违反自包含原则的:
索引在内部表空间集,而表在外部表空间集(相反地,如果表在内部表空间集,而索引在外部表空间集,则不违反自包含原则);
分区表一部分区在内部表空间集,一部分在外部表空间集(对于分区表,要么全部包含在内部表空间集中,要么全不包含);
如果在传输表空间时同时传输约束,则对于引用完整性约束,约束指向的表在外部表空间集,则违反自包含约束;如果不传输约束,则与约束指向无关;
表在内部表空间集,而 lob 列在外部表空间集,则违反自包含约束。
通常可以通过系统包 DBMS_TTS 来检查表空间是否自包含,验证可以以两种方式执行:非严格方式和严格方式。
获取用户及其权限的SQL
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | 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'); SELECT DBMS_METADATA.GET_DDL('USER', 'LHR') DDL_SQL FROM DUAL UNION ALL SELECT DBMS_METADATA.GET_GRANTED_DDL('SYSTEM_GRANT', 'LHR') FROM DUAL UNION ALL SELECT DBMS_METADATA.GET_GRANTED_DDL('ROLE_GRANT', 'LHR') FROM DUAL -- UNION ALL -- SELECT DBMS_METADATA.GET_GRANTED_DDL('OBJECT_GRANT', 'LHR') FROM DUAL ; |
检查环境变量
1 | env | egrep "ORACLE_SID|ORACLE_HOME" |
开启块改变跟踪功能
Block change tracking 进程记录自从上一次0级备份以来数据块的变化,并把这些信息记录在跟踪文件中。RMAN 使用这个文件判断增量备份中需要备份的变更数据。这极大的提高了备份性能和速度,RMAN 可以不再扫描整个文件以查找变更数据。
1 2 3 4 | 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; |
如果开启BCT,那么需要在源端安装补丁Bug 16850197。该补丁在11.2.0.3.9和11.2.0.4版本的PSU中提供。
incremental backup的目的是只备份那些自上次备份以来发生过改变的block。然而,即使只有一小部分发生改变,incremental backup也要读取完整的数据文件。block change tracking功能解决了这个问题。它使用change tracking writer(CTWR)后台进程,在change tracking file文件中,记录所有数据库中变化的物理位置。启动block change tracking功能后,level 0级的incremental backup依然要扫描整个数据文件,因为change tracking file还没有映射到block的状态。对于后续级别的incremental backups,RMAN使用change tracking data决定哪些需要读取。通过消除对整个数据文件的read,提高了性能。
时区需要一致
1 | select dbtimezone from dual; |
目标端补丁情况
建议目标端打最新的PSU补丁。
1 | SELECT * FROM dba_registry_history; |
组件检查
目标端需要包含源端的所有组件。
1 | select comp_id,comp_name,version,status from dba_registry; |
目标端的db_files参数不能小于源端
1 | show parameter db_files |
迁移对象个数统计
需要确认,非业务用户下是否有业务数据,例如SYS用户是否有业务数据:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | -- 需要迁移的对象和数量 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; |
2、全量迁移
在此步骤中,表空间的数据文件将从源端数据库传输到目标端数据库,本步骤只需要执行一次,数据文件传输过程中不影响源端数据库正常访问。
此处有2种方法:dbms_file_transfer和rman方法。对于数据文件很多的情况下来说,dbms_file_transfer是推荐的方法。
方法A为dbms_file_transfer方式;方法B为rman方式。
方法2A.1、源端和目标端都需要配置XTTS脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | 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,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 -- 或者 scp -r /home/oracle/scripts oracle@172.72.0.10:/home/oracle/scripts |
2A.2、创建相关directories和dblink
源端创建SOURCEDIR:
1 2 | create directory sourcedir as '/u01/app/oracle/oradata/LHR11G/'; grant all on directory sourcedir to public; |
目标端创建DESTDIR:
1 2 | create directory DESTDIR as '/u01/app/oracle/oradata/LHR11G/'; grant all on directory DESTDIR to public; |
目标端创建DBLINK
在目标端创建指向源端的dblink:
1 2 3 | create public database link ttslink connect to system identified by lhr using '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.17.0.2 )(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = LHR11G) ) )'; |
2A.3、xttdriver.pl -S做迁移准备
首先,确保源库处于OPEN阶段,所有表空间都处于online状态:
1 2 3 4 5 | 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做迁移准备:
1 2 3 | cd /home/oracle/scripts export TMPDIR=/home/oracle/scripts $ORACLE_HOME/perl/bin/perl xttdriver.pl -S |
此过程会产生2个脚本,xttnewdatafiles.txt和getfile.sql
1 2 3 4 5 6 7 8 9 10 11 | [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 |
2A.4、将源端xttnewdatafiles.txt和getfile.sql传到目标端
1 2 3 4 5 | scp /home/oracle/scripts/getfile.sql 172.17.0.4:/home/oracle/scripts/ scp /home/oracle/scripts/xttnewdatafiles.txt 172.17.0.4:/home/oracle/scripts/ |
2A.5、在目标端执行数据文件的拷贝(全量迁移)
1 2 3 | cd /home/oracle/scripts export TMPDIR=/home/oracle/scripts $ORACLE_HOME/perl/bin/perl xttdriver.pl -G |
本步骤将花费数据库迁移的大部分时间,因为本步骤会传输源端的数据文件到目标端。如果目标端到源端的网络很慢,例如,走公网,速率不到2MB/S,那这个过程将很慢!
本步骤执行完成,可以在目标端数据库数据文件存储目录发现从源端传输过来的数据文件。
若字节序格式不同,也会在该步骤自动隐式进行转换。
方法2B.1、源端和目标端都需要配置XTTS脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | 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,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 -- 或者 scp -r /home/oracle/scripts oracle@172.72.0.10:/home/oracle/scripts |
2B.2、源端调用 xttdriver.pl -p做迁移准备
首先,确保源库处于OPEN阶段,所有表空间都处于online状态:
1 2 3 4 5 | 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做迁移准备:
1 2 3 | cd /home/oracle/scripts export TMPDIR=/home/oracle/scripts $ORACLE_HOME/perl/bin/perl xttdriver.pl -p |
过程:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | [oracle@lhrora11204 scripts]$ cd /home/oracle/scripts [oracle@lhrora11204 scripts]$ export TMPDIR=/home/oracle/scripts [oracle@lhrora11204 scripts]$ $ORACLE_HOME/perl/bin/perl xttdriver.pl -p ============================================================ trace file is /home/oracle/scripts/prepare_Dec10_Fri_09_41_42_107//Dec10_Fri_09_41_42_107_.log ============================================================= -------------------------------------------------------------------- Parsing properties -------------------------------------------------------------------- -------------------------------------------------------------------- Done parsing properties -------------------------------------------------------------------- -------------------------------------------------------------------- Checking properties -------------------------------------------------------------------- -------------------------------------------------------------------- Done checking properties -------------------------------------------------------------------- -------------------------------------------------------------------- Starting prepare phase -------------------------------------------------------------------- Prepare source for Tablespaces: 'TS_LHR' /u01/app/xtts/df_bk xttpreparesrc.sql for 'TS_LHR' started at Fri Dec 10 09:41:42 2021 xttpreparesrc.sql for ended at Fri Dec 10 09:41:43 2021 Prepare source for Tablespaces: 'USERS' /u01/app/xtts/df_bk xttpreparesrc.sql for 'USERS' started at Fri Dec 10 09:41:50 2021 xttpreparesrc.sql for ended at Fri Dec 10 09:41:50 2021 Prepare source for Tablespaces: '''' /u01/app/xtts/df_bk xttpreparesrc.sql for '''' started at Fri Dec 10 09:41:56 2021 xttpreparesrc.sql for ended at Fri Dec 10 09:41:56 2021 Prepare source for Tablespaces: '''' /u01/app/xtts/df_bk xttpreparesrc.sql for '''' started at Fri Dec 10 09:41:57 2021 xttpreparesrc.sql for ended at Fri Dec 10 09:41:57 2021 Prepare source for Tablespaces: '''' /u01/app/xtts/df_bk xttpreparesrc.sql for '''' started at Fri Dec 10 09:41:58 2021 xttpreparesrc.sql for ended at Fri Dec 10 09:41:59 2021 -------------------------------------------------------------------- Done with prepare phase -------------------------------------------------------------------- -------------------------------------------------------------------- Find list of datafiles in system -------------------------------------------------------------------- -------------------------------------------------------------------- Done finding list of datafiles in system -------------------------------------------------------------------- |
该操作执行过程包括以下内容:
1、此过程会将相关的表空间文件执行一次镜像拷贝过程,可以认为是全备,可以在rman中执行“list copy;”查看。此处会把数据文件拷贝一份到/u01/app/xtts/df_bk目录。需要注意目录/u01/app/xtts/df_bk的空间。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | RMAN> list copy; using target database control file instead of recovery catalog specification does not match any control file copy in the repository List of Datafile Copies ======================= Key File S Completion Time Ckp SCN Ckp Time ------- ---- - ------------------- ---------- ------------------- 3 4 A 2021-12-10 09:41:54 4157003 2021-12-10 09:41:54 Name: /u01/app/xtts/df_bk/USERS_4.tf Tag: PREPARE 2 6 A 2021-12-10 09:41:48 4156956 2021-12-10 09:41:47 Name: /u01/app/xtts/df_bk/TS_LHR_6.tf Tag: PREPARE |
2、会在/home/oracle/scripts 目录下产生几个文件,xttplan.txt、rmanconvert.cmd和xttnewdatafiles.txt:
1 2 3 4 5 6 7 | [oracle@lhrora11204 scripts]$ ll -lrt .... -rw-r--r-- 1 oracle oinstall 39 Dec 10 09:41 xttplan.txt -rw-r--r-- 1 oracle oinstall 376 Dec 10 09:41 rmanconvert.cmd -rw-r--r-- 1 oracle oinstall 108 Dec 10 09:42 xttnewdatafiles.txt drwxr-xr-x 2 oracle oinstall 4096 Dec 10 09:42 prepare_Dec10_Fri_09_41_42_107 |