随着x86架构服务器的迅速发展,企业从RISC架构服务器向x86架构服务器的转型也成为了潮流,即Unix to Linux,在行业里被简称为U2L。
如何快捷、高效、平稳、安全地将Oracle数据库“小型机+集中式存储”环境迁移至“x86架构平台+分布式存储”,如何将这些单库容量达到10TB级,甚至30TB、50TB的数据库在有限的停机时间内平稳、安全地迁移至x86服务器中,如何利用好每一个数据迁移工具的优缺点来达到方便、快捷、高效地完成数据库管理工作,是每个数据库管理员(DBA)需要认真思考的问题。
XTTS(Cross Platform Transportable Tablespaces,跨平台传输表空间),是Oracle自10g推出的用来移动单个表空间数据,以及创建一个完整的数据库从一个平台到另一个平台的迁移备份方法。
XTTS 迁移步骤
下面就从XTTS的迁移步骤出发,一步一步来了解使用XTTS进行表空间传输的整个迁移步骤。
首先通过图6-5来看一下Oracle 11gR2以前版本的XTTS典型的迁移步骤。
通过图6-5可以看出,在Oracle 11gR2以前使用XTTS迁移数据中是没有增量前滚这一步,必须在源库表空间完全只读状态下才能进行数据迁移。由于数据传输又必须在数据库启动中只读状态下来读取,另外整个迁移数据的过程是一个串行的步骤,所以此过程所需要的时间同数据库数据量的大小成正比。
如果数据量很大,数据传输和转换的时间可能会很长。因此在Oracle 11gR2以后,Oracle推出了通过前滚数据文件,复制数据后再进行多次增量备份的XTTS来完成迁移过程。在这个过程中通过开启块跟踪特性,根据SCN号来执行一系列的增量备份,并且通过对块跟踪文件的扫描,来完成增量数据的增量备份应用。
最后再通过一定的停机时间,在源库Read Only的状态下进行最后一次增量备份转换应用,使得整个迁移过程的停机时间同源库数据块的变化率成正比,这样大大缩短了停机时间。
如图6-6所示,可以把Oracle 11gR2以后版本的整个迁移过程分为7个阶段。
XTTS 迁移方式
XTTS基于一组rman-xttconvert的脚本文件包(参考MOS 1389592.1)来实现跨平台的数据迁移,主要文件是Perl 脚本 xttdriver。xttdriver.pl是备份、转换、应用的执行脚本,xtt.properties则是属性文件,其中包含XTTS配置的路径、参数。
采用XTTS迁移方式,具备跨平台字序转换和全量初始化加增量Merge的功能,非常适用于异构OS跨平台迁移,成为数据库实施人员中公认的大数据量跨平台迁移的最佳选择。
传统的XTTS要求数据由源端到目标端传输的整个过程中,表空间必须置于只读模式,严重影响业务可用性。XTTS方式可以在业务正常运行的情况下,进行物理全量初始化、增量数据块备份、数据高低字节序转换、增量数据块应用、保持目标端与源端数据的同步,整个过程不影响源端数据库使用。在最后的增量数据块应用完毕后,利用停机窗口进行数据库切换,显著地减少了停机时间。
rman-xttconvert包参数说明如表6-2所示。
表6-2: xtt.properties参数说明
参 数 范 例 | 意 义 |
---|---|
tablespaces=TS1,TS2 | 需要传输的表空间 |
platformid=2 | 源库的platform_id,v$database中得到 |
srcdir=src1,src2 | 当使用dbms_file_transfer时使用,表示源库存放数据文件的路径 |
dstdir=dst1,dst2 | 当使用dbms_file_transfer时使用,目标库存放数据文件的路径 |
srclink=ttslink | 从目标端指向源端的dblink,当使用dbms_file_transfer时使用 |
dfcopydir=/storage | 源端用于存放数据文件的copy,使用rman时使用 |
backupformat=/storage | 源端用于存放增量备份的目录,无论哪种方式都需要设置 |
stageondest=/storage | 目标端存放数据文件copy目录和存放增量备份的目录 |
storageondest=/oradata/prod/%U | 数据文件的最终存放点 |
backupondest=/storage | 增量备份格式转换后的输出目录 |
cnvinst_home= | 不同的增量转换目录使用时设置该参数 |
cnvinst_sid | 不同中转sid使用时使用 |
parallel=3 | 默认为3 |
rollparallel=2 | |
Getfileparallel=8 | 默认为8,使用rman时的并行设置 |
方式一:dbms_file_transfer
DBMS_FILE_TRANSFER包是Oracle提供的一个用于复制二进制数据库文件或在数据库之间传输二进制文件的程序包。在XTTS迁移中,利用不同的参数进行数据文件传输转换完成迁移。
dbms_file_transfer参数示例如表6-3所示。
表6-3: dbms_file_transfer参数示例
Subprogram 参数 | Description 描述 |
---|---|
COPY_FILE | 从源目录中读取一个文件并创建一个在目标目录的副本,源和目标目录都可以是本地文件系统,或是自动存储管理(ASM)磁盘组,或本地文件系统和ASM之间复制 |
GET_FILE | 从远程数据库读取远程文件,然后创建一个本地文件系统中的文件副本或ASM |
PUT_FILE | 读取本地文件或ASM和从远程数据库创建一个远程文件系统中文件的副本 |
dbms_file_transfer语法示例如表6-4所示。
表6-4 dbms_file_transfer语法示例
参数 | 示例 |
---|---|
COPY_FILE | BEGIN DBMS_FILE_TRANSFER.COPY_FILE(‘SOURCEDIR’,‘t_xdbtmp.f’, ‘DGROUP’, ‘t_xdbtmp.f’); END; |
GET_FILE | BEGIN DBMS_FILE_TRANSFER.GET_FILE ( ‘df’ , ‘a1’ , ‘dbs1’, ‘dsk_files’ , ‘oa5.dat’ ); DBMS_FILE_TRANSFER.GET_FILE ( ‘dsk_files’ , ‘a2.dat’ , ‘dbs1’, ‘dsk_files’ , ‘a2back.dat’ ); END ; |
PUT_FILE | BEGIN DBMS_FILE_TRANSFER.PUT_FILE ( ‘ft1_1’ , ‘a2.dat’ , ‘df’ , ‘a4.dat’ , ‘dbs2’ ) ; END ; |
注:如果数据库存在大量的表空间文件,那么使用dbms_file_transfer包来进行迁移是速度最快的。
方式二:RMAN Backup
RMAN Backup 方式是基于RMAN备份原理,通过使用rman-xttconvert包提供的参数,对数据库进行基于表空间的备份,将备份生产的备份集写到本地或者NFS盘上,然后再通过rman-xttconvert包中包含的不同平台之间数据文件格式转换的包对数据文件格式进行转换,最后通过记录的表空间FILE_ID号生成元数据的导入脚本,通过db_link执行完成。rman方式XTTS执行步骤如表6-5所示。
表6-5 rman方式XTTS执行步骤
使用阶段 | 脚 本 名 字 | 用 途 |
---|---|---|
准备 | perl xttdriver\.pl \-p (源端) | 为了生成下述文件 |
准备 | rmanconvert\.cmd | Rman数据文件转化格式的命令 |
准备 | xttplan\.txt | 记录scn号 |
准备 | perl xttdriver\.pl \-c (目标端) | 转换文件格式,直接到最终目录 |
增量前滚 | perl xttdriver.pl -i (源端) | |
增量前滚 | tsbkupmap.txt | 表空间对应增备 |
增量前滚 | incrbackups.txt | 增备的备份集的路径 |
增量前滚 | xttplan.txt.new | 记录新的scn号 |
增量前滚 | perl xttdriver.pl -s (源端) | 将xttplan.txt.new替换xttplan.txt |
增量前滚 | perl xttdriver.pl –r (目标端) | 应用增备 |
传输阶段 | perl xttdriver.pl -e | 生成导入元数据的脚本 |
方式三:手工XTTS迁移
在实践中,可以总结提炼割接的步骤,创建手工脚本执行XTTS迁移,以加强自动化和迁移速度。以下总结了迁移的过程,可以把需要进行迁移的工作根据任务以及子任务的方式固化,形成一套可重复执行的迁移技术方案。
如表6-6所示是手工XTTS迁移说明(以实际生产为例),实践中可以参考这些步骤组织适合自己的流程和方法。
表6-6 手工脚本方式迁移准备
操 作 对 象 | 操 作 说 明 |
---|---|
目标数据库安装配置 | 根据标准数据库安装手册进行数据库软件,数据库实例创建,配置参数 |
源库新监听创建 | srvctl add listener -l listener_1523 -p 1523 源端数据库创建监听用于远程访问数据比对的监听,此处用于正式切换时,源库生产监听停止,启用此新建的监听,使得其他无业不能连接 |
源库Dblink创建 | create user enmoXTTStest identified by “xxxxxxx”; grant dba to enmoXTTStest; 创建迁移切换数据一致性比对用户、DBLINK连接用户,权限为DBA权限 |
目标库Dblink创建 | 创建基于DBA权限用户的DB_LINK连接到源端,使用listener_1523 |
目标库其他配置 | 安全规范、性能参数配置,删除USERS表空间,新建一个默认的表空间 |
NFS存储准备 | 一期NFS存储挂载用于数据初始化工作,二期NFS存储挂载用于增量备份 |
源库开启块跟踪 | 源端开启块跟踪,需关注块跟踪大小 ALTER DATABASE ENABLE BLOCK CHANGE TRACKING USING FILE ‘+SATADATA/changetracking.chg’; |
源库表空间自包含 | SELECT * from sys.transport_set_violations; |
源库获取用户相关环境信息 | 用户,DBLINK,PROFILE,PRIV |
源库临时表信息 | select o.owner, object_name, created from dba_objects o, dba_tables t where o.object_name = t.table_name and o.owner = t.owner and t.TEMPORARY = ‘Y’ order by 1, 3; |
排除系统表空间 | select to_char(wm_concat(TS#)) from v$tablespace where NAME not in (‘UNDOTBS1’,‘SYSTEM’,‘SYSAUX’,‘TEMP’,‘UNDOTBS2’,‘UNDOTBS3’,‘UNDOTBS4’,‘XDB’,‘BASE’) and name not in (select distinct TABLESPACE_NAME from DBA_TEMP_FILES); |
源库准备rman 备份脚本 | 根据生成的TS#号制订出RMAN COPY脚本 |
执行rman copy脚本 | 分别在源库多个RAC节点发起RMAN 数据文件到NFS存储 |
准备数据文件转换脚本 | 根据NFS磁盘上复制数据文件完成后的结果,通过脚本拉取convert转换时所需要的执行脚本 |
执行数据文件格式转换 | 在目标库多个节点执行:RMAN CONVERT 将数据文件转成Linux平台,并存放在ASM里面 |
准备增量备份脚本 | 根据第一次RMAN COPY 确认过的SCN进行增量同步备份 |
获取增量转换清单 | 增量备份文件转换成Linux平台生成转换清单,增量转换文件到/dump/enmo/incr目录,生成增量备份转换的结果集存放到执行脚本中 |
应用增量备份 | 先将asmcmd中转换好的文件名作为列表存放在列表文件中,使用for循环读取,list文件名为apply_list.txt |
XTTS迁移割接步骤,如表6-7所示。
表6-7 手工脚本方式迁移切割步骤
操 作 对 象 | 手工脚本方式迁移切割步骤 |
---|---|
源库 | 在业务停业务时,清理回收站数据 purge dba_recyclebin |
源库 | 在业务停业务时,创建验证用户 create user enmo_test identified by xxxxxxx; conn enmo_test/xxxxxxxx 在业务停止后,创建数据验证表并插入验收数据 create table enmo_test(enmo_a number) insert into select lenvel from dual connect by lenve <1000; |
修改JOB参数 | 停服务与修改JOB参数 alter system set job_queue_processes=0; |
监听 | 源库和目标库监听停止 srvctl stop listener -l listener srvctl stop listener -l listener_scan1 |
查杀活动进程 | 查杀进程,确认无活动事务与死事务,包括分布式事务 ps -ef|grep LOCAL=NO|grep -v grep|awk ‘{print $2}’|xargs kill -9 select local_tran_id,state from dba_2pc_pending ; KILL JOB进程 |
表空间只读状态 | 源库表空间置为read only 状态 |
增量备份转换应用 | 根据上一次增量备份SCN号进行最后一次增量备份转换并应用 |
源库元数据、元对象导出 | 在做增量备份的同时,做元数据、元对象导出exp、expdp |
创建用户 | 根据XTTS执行前收集到的用户信息创建用户 |
创建 database link | 根据XTTS执行前收集到的用户信息创建dblink |
目标库全备 | 备份数据库,用于回退 |
目标库表空间读写模式 | 修改目标库表空间read write |
元数据导入 | 目标库导入传输表空间的元数据(imp、impdp) |
数据库可用性、验证数据验证 | 查询测试表是否有数据 |
业务核心数据验证 | 验证核心表的数据是否一致,核心表验证由开发、应用进行 |
元对象导入 | 二次导入(存储过程、试图等信息)导入数据库的元对象 |
设置默认表空间 | 将用户的默认表空间修改成原来的值 |
用户权限 | 给角色及对象授权 |
对象对比 | 迁移对象比对 |
编译无效对象 | 开启并行进程,编译无效对象 DECLARE threads pls_integer := 150; BEGIN utl_recomp.recomp_parallel(threads); END; / |
验证数据清理 | 删除测试表、数据验证用户、迁移使用的DBLINK |
统计信息导入 | 导入表与索引的统计信息,可以按schema或者对象来导入 |
数据量比对 | 对象数、表记录数 |
迁移contab内容 | 提前将crontab里面的脚本迁移到目标数据库 |
开启服务 | 业务确认没有问题后开启监听与启动服务 srvctl start service -d orcl -s |
收集字典表统计信息 不影响业务 | EXEC DBMS_STATS.GATHER_DICTIONARY_STATS; EXEC DBMS_STATS.GATHER_FIXED_OBJECTS_STATS; |
新库:打开JOB | alter system set job_queue_processes=1000; |
【实战案例分享】使用XTTS技术进行U2L跨平台数据迁移(https://www.modb.pro/db/22548)