作者简介


谢金融

云和恩墨东区交付部 Oracle 工程师,多年来从事 Oracle 第三方服务,曾服务过金融、制造业、物流、政府等许多行业的客户,精通数据库迁移、性能优化和故障诊断。

本文由恩墨大讲堂146期线上分享整理而成。课程回看可点击文末“阅读原文”。

1
前期准备

1.1.  检查数据库时区,保持两边一致

select dbtimezone from dual;

DBTIME

------

+08:00

1.2.  检查数据库字符集,保持两边一致

select * from nls_database_parameterswhere parameter like '%CHARACTERSET%';

PARAMETER                      VALUE

------------------------------------------------------------------

NLS_CHARACTERSET               AL32UTF8

NLS_NCHAR_CHARACTERSET         UTF8

1.3.  检查目标端补丁情况

目标端 PSU无特殊需求,可以随情况安装最新即可。

select 'opatch',comments fromdba_registry_history

'OPATC COMMENTS

--------------------------------------------------------

opatch PSU 11.2.0.4.4

如果准备阶段使用 DBMS_FILE_TRANSFER方法,目标端建议安装的补丁如下:

Patch 19023822,修复目标端使用 DBMS_FILE_TRANSFER.GET_FILE包获取源端数据文件出现 ORA-03106 的情况。

Patch 22171097: MERGE REQUEST ON TOP OF DATABASE PSU11.2.0.4.6 FOR BUGS 17534365 19023822

如果准备阶段使用 RMAN 方法,目标端没有小补丁安装需求。

1.4.  检查组件安装情况,对于不一样的组件,需要有所标记

Select comp_name from dba_registry;

源端组件情况

COMP_NAME

--------------------------------------------------------------------------------

OracleApplication Express

OracleMultimedia

OracleXML Database

OracleExpression Filter

OracleRules Manager

OracleWorkspace Manager

OracleDatabase Catalog Views

OracleDatabase Packages and Types

JServerJAVA Virtual Machine

OracleXDK

OracleDatabase Java Packages

目标段组件情况

COMP_NAME

--------------------------------------------------------------------------------

OracleEnterprise Manager

OracleWorkspace Manager

OracleDatabase Catalog Views

OracleDatabase Packages and Types

备注:组件不同,可能导致源端的部分对象无法导入到目标端。

1.5.  检查是否使用了 Key Compression 的索引组织表

Key compression

Selectindex_name,table_name from dba_indexes where compression=’ENABLED’;

索引组织表

Select owner,table_namefrom dba_tables where iot_type is not null;

如果存在,目标端需要安装 Patch 14835322,否则索引组织表的对象无法导入到目标端。

目前该补丁只在 11.2.0.3 版本下提供,针对其他版本,如果 IOT表或者键值压缩索引无法导入时,建议在元数据导入完成后,将该类对象传输过去。

1.6.  检查源端是否有 Cluster 对象

If the sourcecontains cluster objects, then run "analyze cluster &cluster_namevalidate structure cascade" after XTTS has been completed in the targetdatabase and if it reports an ORA-1499 open the trace file and review if it hasentries like:

kdcchk: indexpoints to block 0x01c034f2 slot 0x1 chain length is 256

kdcchk: chain count wrong 0x01c034f2.1 chain is 1 index says 256

last entry 0x01c034f2.1 blockcount = 1

kdavls: kdcchk returns 3 when checking cluster dba 0x01c034a1 objn 90376

Then to repairthis inconsistency either:

1. rebuild thecluster index.

or

2. Install fix bug 17866999 and run dbms_repair.repair_cluster_index_keycount

If afterrepairing the inconsistency the "analyze cluster &cluster_namevalidate structure cascade" still reports issues then recreate theaffected cluster which involves recreating its tables.

1.7.  检查 RMAN DEVICE TYPE DISK 是否配置 COMPRESSED

ORA-19837:invalid blocksize 0 in backup piece header

ORA-06512: at "SYS.X$DBMS_BACKUP_RESTORE", line 2338

ORA-06512: at line 40

配置压缩会导致以上报错,通过rman > show all; 检查

1.8.  SYS、SYSTEM 用户是否有对象存在于业务表空间

如数据库用户 SYS、SYSTEM 在业务表空间上创建有对象,则这些对象不能通过 XTTS 迁移,需要在目标库手工创建。

select table_name, owner, tablespace_name from dba_tables where tablespace_name not in('SYSTEM','SYSAUX') and owner in ('SYS','SYSTEM');

1.9.  检查表空间自包含

在传输阶段可能因为目标端数据文件目录所限制,需要将各个表空间拆分进行传送,在导入元数据阶段,考虑到字包含特性,需要将所有的表空间汇总进行传送。

检查表空间时,只检查业务表空间的自包含情况;系统表空间,临时表空间,undo 表空间不在检查列。

exec dbms_tts.transport_set_check('将所有需要传输的表空间名写在这里用逗号隔开' ,TRUE,True);

select * fromtransport_set_violations;

1.10.  检查源端 Compatible 参数

source 端不可以是 windows P7,source 端的 COMPATIBLE.RDBMS 必须大于 10.2.0,且不大于目标端 COMPATIBLE.RDBMS

show parameter compatible

如果目标端数据库版本是 11.2.0.3 或更低。那么需要在目标端装 11.2.0.4 并创建实例,然后用来进行备份集转换。如果 11.2.0.4 中转实例使用 ASM。那么 ASM 版本也必须是 11.2.0.4,否则报错 ORA-15295。

1.11.  如果启用 Block Change Tracking 功能

该功能在源端数据量较大或者数据改变较大时启用,需要在源端安装补丁 Bug 16850197。

该补丁在以下版本 PSU中提供

  • 2.0.3.9

  • 2.0.4

如果源库是在上述版本前,需要安装个别补丁。

1.12.  检查目标端的 DB_FILES 参数

在元数据导入阶段,如果目标端的 DB_FILES 参数小于源端的 DB_FILES 参数,会导致元数据导入出错,所以要确保目标端参数比源端大于或者等于。

Show parameter db_files

1.13.  确认生产库的 recycle in 功能是关闭,并手工清空回收站

showparameter recyclebin;

NAME        TYPE                   VALUE

--------------------------------- --------

recyclebin  string                 on (这里应该为 off)

关闭回收站

alter systemset recyclebin=’off’ scope=both;

1.14.  数据文件状态检查

Select distinct status from v$datafile;

正常返回应为:ONLINE、SYSTEM。

2
XTTS 操作步骤
  1. 迁移步骤大致如下:

  2. 初始化阶段,配置参数文件

  3. 开启块追踪特性

  4. 准备阶段,进行数据全量同步

  5. 增量阶段,进行数据文件的增量同步

  6. 在停机同步前,在目标端新建 Owner 用户,临时表

  7. 传输阶段,最后一次增量同步,并导入元数据

  8. 将原库中的其余用户导入到目标端中

  9. 校验数据文件,检查有无坏块

3
RMAN 方式


注意:

使用 RMAN方式有一个严重的限制:同一批次的表空间传输到目标端后,都在同一个目录下,即目标端的最终存放数据文件的目录大小要足够存放一个批次中所有的表空间数据文件。

源端和目标端需要挂载存储用于存放所有数据文件的镜像文件,建议使用 NFS 的方式将存储远程从源端挂载到目标端,减少备份传送时间。

3.1.  初始化阶段,配置参数文件

3.1.1. 创建 Dest 端到 Source 端的 DBLINK

该步骤创立的 DBLINK用于在传输阶段的元数据导入时使用

ttslink=

(DESCRIPTION =

(ADDRESS =(PROTOCOL = TCP)(HOST = ip地址)(PORT = 1521))

(CONNECT_DATA =

(SERVER =DEDICATED)

(SERVICE_NAME = 实例名)

)

)

create public database link ttslink connect to systemidentified by password using 'ttslink';

测试DBLINK的连通性

select * from v$version@ttslink;

来了

3.1.2. Source 端和 Dest 端创建目录用于存放 XTTS脚本

[oracle@source]$ pwd

/home/oracle/xtt

[oracle@source]$ unzip rman_xttconvert_v3.zip

Archive: rman_xttconvert_v3.zip

inflating: xtt.properties

inflating: xttcnvrtbkupdest.sql

inflating: xttdbopen.sql

inflating: xttdriver.pl

inflating: xttprep.tmpl

extracting: xttstartupnomount.sql

3.2.  开启块追踪特性

SQL> alter database enable block change trackingusing file '+datadg';

Database altered.

按照文档所示,开启这个特性后,使用 XTTS会触发 BUG16850197,需要安装个别补丁,但是目前该补丁只在 11.2.0.3.8 上有提供。

经过测试,其余版本没有触发 bug。

注意:

RAC 环境下,需要将块追踪文件存放在共享存储上,否则会导致 DFS LOCKHANDLE,导致实例异常。

3.3.  准备阶段,进行数据全量同步

3.3.1. 修改参数

源端平台 ID 查询

select * from v$transportable_platform

/home/oracle/xtt2/ xtt.properties

tablespaces=XTTS 需要大写

platformid=13

dfcopydir=/home/oracle/xtt2/dfcopydir

backupformat=/home/oracle/xtt2/backup

stageondest=/home/oracle/xtt2/stageondest

storageondest=/oggtest/oggtest

backupondest=/home/oracle/xtt2/backupondest

parallel=2

rollparallel=2

mkdir /home/oracle/xtt2/dfcopydir

mkdir /home/oracle/xtt2/backup

mkdir /home/oracle/xtt2/stageondest

mkdir /home/oracle/xtt2/backupondest

附录解释:

tablespaces=               ----需要迁移的表空间

platformid=           ----源 OS 平台 ID

dfcopydir=             ----源数据库备份文件存放目录

backupformat=            ---源数据库增备文件存放目录

stageondest=              ----目标据库备份文件存放目录

storageondest=         ----目标据库正式文件存放目录

backupondest=         ----目标据库增备文件存放目录

parallel=                ----备份,转化的并行度

rollparallel=             ----增备的并行度

getfileparallel=            ---- 使用 dbms_file_transfer 方式的并行度

3.3.2. 将 XTTS目录 Copy 传送到目标端

scp -r /home/oracle/xtt2 sprac2:/home/oracle

3.3.3. 设置 TMPDIR

If TMPDIR is not set, output files are created in andinput files are expected to be in /tmp.

[oracle@source]$ export TMPDIR=/home/oracle/xtt2

[oracle@dest]$ export TMPDIR=/home/oracle/xtt2

3.3.4. 源端 Prepare

perl /home/oracle/xtt2/xttdriver.pl -p

初始化之后产生 xttplan.txt  rmanconvert.cmd

xttplan.txt 记录了当前 SCN,也就是下次需要增量的开始 SCN

rmanconvert.cmd 记录了文件转换的名字

3.3.5. 源端生成的数据文件 Copy 到目标端

scp dfcopydir/XTTS_10.tf sprac2:/home/oracle/xtt2/stageondest

3.3.6. 转换数据文件 Copy 的 Endian 模式

export TMPDIR=/home/oracle/xtt2

scp rmanconvert.cmd sprac2:/home/oracle/xtt2

perl xttdriver.pl -c

转换成功之后会生成 xttnewdatafiles.txt

整个过程,存放在 stageondest 的 copy,将会转换写入到 storageondest 参数设置的最终存放点。转换完成后,copy 就可以删除了。

3.4.  增量阶段,进行数据文件的增量同步

3.4.1. 源端创建增量备份

[oracle@sprac1 xtt2]$ perl xttdriver.pl -i

第一次增量备份之后产生的配置文件为 tsbkupmap.txt  incrbackups.txt,这两个为增量与数据文件对应关系配置,在做增量恢复时候需要用到。增量备份文件放在了backupformat 指定位置。

3.4.2. 传输增量备份到目标端

[oracle@sprac1 xtt2]$ scp `cat incrbackups.txt`sprac2:/home/oracle/xtt2/stageondest

3.4.3. 目标端应用增量备份

[oracle@sprac1 xtt2]$ scp xttplan.txt tsbkupmap.txtsprac2:/home/oracle/xtt2

[oracle@sprac2 xtt2]$ perl xttdriver.pl -r 目标端执行

3.4.4. 源端为之后的增量备份确定新的 SCN

[oracle@sprac1 xtt2]$ perl xttdriver.pl -s

该步骤会将 -i 时生成的 xttplan.txt.new 改名为 xttplan.txt,并将原来的 xttplan.txt 备份。

3.4.5. 重复前滚操作

重复操作步骤 3.4.1 - 3.4.4,恢复增量数据。

3.5.  停机同步前,在目标端新建 Owner 用户

3.5.1. 创建临时表空间

依照原库上的临时表空间大小,在目标端创建同名临时表空间。

3.5.2. 创建 Owner 用户

在源端执行下列语句

select 'create user '||name||' identified by values'''||password||''' default tablespace users temporary tablespace temp;' fromuser$ where name in (‘输入所需要创建的用户名’)

将生成的语句,在目标端执行,创建用户。

3.6.  传输阶段,最后一次增量同步,并导入元数据

3.6.1. 将原库表空间置为只读状态

SQL> alter tablespace xtts read only;

3.6.2. 开始最后做增量备份

重复步骤 3.4.1 - 3.4.3,做最后的增量恢复。

3.6.3. 自定义 Role 处理

---自定义角色,Role(R_INIT_USER)

select GRANTED_ROLE from dba_role_privs whereGRANTEE='XTTS';

create role R_INIT_USER;

select 'grant '||PRIVILEGE||' to '||GRANTEE||';' fromdba_sys_privs where grantee='R_INIT_USER';

3.6.4. 自定义 Profile 处理

---执行源端保留的 profile 信息

set long 1000000

SET PAGESIZE 3000

set lines 200

SET HEADING OFF

SET VERIFY OFF

SET FEEDBACK OFF

set echo on

set timing off

set wrap On

SET LONGCHUNKSIZE 400

spool create_profile.sql

with profile as(

select distinct profile from dba_profiles)

select dbms_metadata.get_ddl('PROFILE',PROFILE) fromprofile;

3.6.5. 临时表处理

---创建临时表

@temp_table.sql

源端生产库采集脚本,目标端执行

set long 1000000

SET PAGESIZE 3000

set lines 200

SET HEADING OFF

SET VERIFY OFF

SET FEEDBACK OFF

set echo on

set timing off

set wrap On

SET LONGCHUNKSIZE 400

select dbms_metadata.get_ddl('TABLE',TABLE_NAME,OWNER)

from DBA_TABLES

where TEMPORARY='Y' and owner in ();

3.6.6. 目标端导入元数据

3.6.6.1.   一次元数据导入

[oracle@sprac2 xtt2]$ perl xttdriver.pl -e

这个步骤会产生一个导入样本脚本 xttplugin.txt,需要修改如下:

在一次元数据导入阶段,不能开启并行,统计信息导入阶段,可以将会话杀除终止

cat xttplugin.txt

impdp directory=DATA_PUMP_DIRlogfile=tts_imp.log \

network_link=xttlinktransport_full_check=no \

transport_tablespaces=XTTS \

transport_datafiles='/oggtest/oggtest/XTTS_10.xtf' exclude=statistics

将统计信息排除,后面开启并行收集统计信息。

3.6.6.2.   二次元数据导入

将第一次没有导入的过程,视图,包,触发器导入。

impdp directory=DATA_PUMP_DIR logfile=tts_imp_2.lognetwork_link=xttlink schemas= 'XTTS' content=metadata_only  exclude=index,table,constraint,statistics

3.6.6.3.   重新在目标端搜集统计信息

execDBMS_STATS.GATHER_SCHEMA_STATS(ownname=>'XTTS',ESTIMATE_PERCENT=>5,method_opt=>'forall columns size 1',cascade=>true,force=>true,degree=>12);

3.7.  将原库中的其余用户导入到目标端中,权限处理

使用如下脚本重新赋权

SET SERVEROUTPUT ON

SET LINESIZE 1000

SET FEEDBACK OFF

SET TRIMSPOOL ON

set long 999999

SET PAGESIZE 1000

spool grant_role_priv.sql

select 'grant '||GRANTED_ROLE||' to '||grantee||';'from dba_role_privs where grantee in() and admin_option='NO'

union

select 'grant '||GRANTED_ROLE||' to '||grantee||' withadmin option;' from dba_role_privs where grantee in() and admin_option='YES';

spool off

SET SERVEROUTPUT ON

SET LINESIZE 1000

SET FEEDBACK OFF

set long 999999

SET TRIMSPOOL ON

SET PAGESIZE 1000

spool grant_sys_priv.sql

select 'grant '||privilege||' to '||grantee||';' fromdba_sys_privs where grantee in() and admin_option='NO'

union

select 'grant '||privilege||' to '||grantee||' withadmin option;' from dba_sys_privs where grantee in()and admin_option='YES';

spool off

SET SERVEROUTPUT ON

SET LINESIZE 1000

SET FEEDBACK OFF

SET TRIMSPOOL ON

set long 999999

SET PAGESIZE 1000

spool grant_tab_privs.sql

select 'grant ' || privilege || ' on ' || owner || '.'|| table_name || ' to ' || grantee || ';' from dba_tab_privs where grantee in()grantable='NO'

union

select 'grant ' || privilege || ' on ' || owner || '.'|| table_name || ' to ' || grantee || ' with grant option;' from dba_tab_privswhere grantee in() and grantable='YES';

spool off

3.8.  校验数据文件,检查有无坏块

RMAN> validate tablespace xtts check logical;

3.9. 编译无效对象,进行数据对比。


@$ORACLE_HOME/rdbms/admin/utlrp.sq

相关阅读:

1. 我们都被骗了,所有的跨平台迁移都可以通过XTTS实现

2. XTTS(Cross Platform Incremental Backup) 的测试例子

3. 迁移神技 XTTS-恩墨小王子再战32TB跨平台U2L

资源下载

关注公众号:数据和云(OraNews)回复关键字获取

‘2017DTC’,2017DTC大会PPT

‘DBALIFE’,“DBA的一天”海报

‘DBA04’,DBA手记4经典篇章电子书

‘RACV1’, RAC系列课程视频及ppt

‘122ARCH’,Oracle 12.2体系结构图

‘2017OOW’,Oracle OpenWorld资料

‘PRELECTION’,大讲堂讲师课程资料

时过境迁:Oracle跨平台迁移之XTTS方案与实践相关推荐

  1. 举一反三:跨平台版本迁移之 XTTS 方案操作指南

    作者 | 罗贵林: 云和恩墨技术工程师,具有8年以上的 Oracle 数据库工作经验,曾任职于大型的国家电信.省级财政.省级公安的维护,性能调优等.精通 Oracle 数据库管理,调优,问题诊断.擅长 ...

  2. 续:跨平台版本迁移之 XTTS 方案操作指南

    作者 | 罗贵林: 云和恩墨技术工程师,具有8年以上的 Oracle 数据库工作经验,曾任职于大型的国家电信.省级财政.省级公安的维护,性能调优等.精通 Oracle 数据库管理,调优,问题诊断.擅长 ...

  3. Oracle跨平台迁移

    XXXXXX房管局 核心信息系统跨平台迁移       迪思杰(北京)数码技术有限公司 2015年05月 客户背景 XXX住房保障和房地产管理局是主管全市房地产和住房制度改革工作的市政府组成部门.负责 ...

  4. Oracle 跨平台迁移——筑梦之路

    oralce表空间跨平台跨版本迁移满足的前提条件:1.源和目标数据库使用相同字节顺序(也就是说little endian与big engian) 2.目标数据库不能有和源库有相同的表空间 3.源和目标 ...

  5. oracle mysql增量迁移_深入浅出XTTS:Oracle数据库迁移升级利器

    内容来源:2017年3月11日,新炬网络高级工程师杨光在"DBAplus北京数据库技术沙龙"进行<深入浅出XTTS:Oracle数据库迁移升级利器>演讲分享.IT 大咖 ...

  6. mysql跨平台迁移复制_手工 XTTS CPT 迁移-跨平台迁移数据库-阿里云开发者社区

    -- xtts 跨平台迁移数据库 -- 步骤: 1.初始化参数设置: 2.将源端数据文件传输到目标系统: 3.转换数据文件为目标系统的字节序: 4.在源端创建增量备份,并传输到目标端: 5.在目标端恢 ...

  7. Oracle数据库迁移到AWS云的方案

    转载:http://www.cnblogs.com/allcloud/p/6148513.html 当前云已经成为常态,越来越多的企业希望使用云来增加基础设施的弹性.减轻基础设施的维护压力,运维的成本 ...

  8. oracle异构迁移mysql方案实施(含原理)——已迁移成功

    从迁移方案的落地.迁移前准备.N次迁移演练.回归测试.性能调优整整用了四个月左右的时间(当然在此期间还包括其他项目及日常操作耗费工时).正式迁移到迁移成功.以及上线开服后性能稳定这些操作已经过去了一个 ...

  9. oracle迁移几种方式,Oracle数据库迁移的几种方式

    Oracle数据库迁移的几种方式 我们常常需要对数据进行迁移,迁移到更性能配置更高级的主机OS上.迁移到远程的机房.迁移到不同的平台下,以下介绍ORACLE的几种数据库迁移方案: 一.exp/imp逻 ...

最新文章

  1. 百度推出新技术 MIP,网页加载更快,广告呢?
  2. 安装DirectX SDK时出现Error Code:s1023 的解决方案
  3. 绘制Nine-Patch图片
  4. workunit 的指的工作单元是什么_分频器是做什么用的?
  5. matlab程序 地震 相干噪声_地震台站台基噪声功率谱概率密度函数Matlab实现
  6. ApacheCN NodeJS 译文集 20211204 更新
  7. 中国传统纹样背景素材|一眼识别东方韵之美
  8. 【转载】一步步构建大型网站架构
  9. 计算机错误代码3420,如何解决vba运行时错误3420
  10. python log文件处理_Python 处理大Log文件
  11. PostgreSQL 为什么不要滥用unlogged table hash index
  12. android高德地图热力图,热力图-自有数据图层-示例中心-JS API 示例 | 高德地图API...
  13. html视频文件哪种格式好,常见的视频格式有哪些?
  14. 用JavaScript实现京东登录页面的用户密码显示或者隐藏功能
  15. 使用EasyPOI导出Excel模板数据(含图片)
  16. 租用云主机可以做什么用?
  17. hexo categories和tags页面不显示解决办法
  18. ai描边工具怎么打开_ai描边面板怎么调出来? ai找不到描边面板的解决办法
  19. IT十年人生过客-二十三-不要情怀要生活
  20. python 语音数据加载和保存

热门文章

  1. python开源项目贡献_65%的公司在为开源项目做贡献
  2. 亚马逊 ai 解雇_解雇社区成员
  3. (1)HTML5概述
  4. ES6/05/正则表达式简介,正则表达式如何使用,正则表达式中的特殊字符(边界符,量词符),预定义类,正则表达式中的替换
  5. 调优 | 别再说你不会 JVM 性能监控和调优了
  6. Bootstrap 下拉菜单
  7. CSS3 盒尺寸 box-sizing属性
  8. es6 async函数的语法
  9. 视觉SLAM笔记(13) 空间变换
  10. mysql不属于nosql_哪个数据库不属于nosql的范畴