合 使用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.xmmup.com/dbbao53oracleyigoupingtaiqianyiliqizhixttsshiyongdbms_file_transferfangshi.html
【DB宝52】Oracle异构平台迁移利器之XTTS(使用rman方式):https://www.xmmup.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用户是否有业务数据: