从迁移方案的落地、迁移前准备、N次迁移演练、回归测试、性能调优整整用了四个月左右的时间(当然在此期间还包括其他项目及日常操作耗费工时)。正式迁移到迁移成功、以及上线开服后性能稳定这些操作已经过去了一个多月时间。由于异构迁移在业界是一个较为困难繁琐的问题,所以经过这么久的沉淀,今天给大家复盘并分享一下整个迁移流程,从前期方案、到最后迁移成功的整个流程,希望给对 ORACLE TO MYSQL 异构迁移流程不清晰的同学,一点思路!
目录
innodb_flush_log_at_trx_commit
一、迁移原由
“去O”,是近些年来一直很火的一个话题。但2019年,也许有着更加特殊的意义。随着国家监管要求、外部环境变化、国产数据库兴起等多种因素,相信今年会是“去O”井喷发展的一年。去O更详细的说是去IOE。
“去IOE”:是阿里巴巴造出的概念。其本意是,在阿里巴巴的IT架构中,去掉IBM的小型机、Oracle数据库、EMC存储设备,代之以自己在开源软件基础上开发的系统。(如公有云厂商产品RDS、CDB等)
二、迁移目标
- 迁移前后结构一致
- 迁移前后数据一致
- 迁移完成上线后——业务运行——性能稳定
- 最终实现oracle数据向mysql数据库的平滑过渡
三、迁移方案落地
1.协同高层确定项目目标
这里需要确定的包括迁移源端(如哪几个oracle数据库)、目标端(如迁移到RDS For MySQL、或者机房自建MySQL)
2.制定迁移计划
这里的迁移计划指的是整个迁移过程的整体排期,包含:
- 前期的迁移工具选型
- 测试环境搭建
- 迁移工具测试
- 对象兼容性统计、对比、改写
- 全量数据校验方案
- 压力测试
- 多次迁移演练、产出迁移方案
- (该方案指的是迁移的详细操作步骤,方案中的操作步骤建议补充到尽可能详细,防止迁移当天由于任何原因出现操作步骤遗忘等任何故障,当然该方案可以留作下次迁移参考,以及经验总结)
- 正式迁移
- 上线后性能调优
那么下面就按照该部分迁移计划中的步骤,叙述详细内容及关键点
四、迁移工具选型(含功能实现原理)
大家再迁移前,可以了解到,迁移涉及到结构迁移和数据迁移,那么在迁移工具选型的时候,需要考虑的几点:
- 该工具可以迁移结构、数据还是二者
- 该工具迁移前后数据库对象的兼容性
- 使用该工具迁移后改写工作量
- 是否可以做全量数据校验
这里简单聊几个目前常见的oracle迁移mysql的工具及与原理:
(1)SQL LOAD
这里使用的是powerdesigner,使用该工具迁移结构,首先在plsql中将oracle数据库中的表结构导出csv/sql,使用powerdesigner加载导出的oracle结构语法转换为mysql结构语法,转换后的结构语法存在大量改写:
-
表注释、列注释全部保留
-
索引数量没有丢失,但是部分唯一索引被修改为普通索引(源库多个索引且全部为唯一索引,这种情况转换后被修改为普通索引)
-
int数据类型全部转换为numeric,float数据类型没有转换,其他同DTS
-
保留了源库的default默认值,没有增加default null
-
分区表全部丢失
-
存储过程全部丢失
-
转换后timestamp类型需要转换其他类型才能导入(测试期间修改为datetime),float没有转换,需要改为double才能导入存在Specified key was too long; max key length is 3072 bytes,需要修改列长度
(2)OGG
Oracle GoldenGate(OGG)可以在多样化和复杂的 IT 架构中实现实时事务更改数据捕获、转换和发送;其中,数据处理与交换以事务为单位,并支持异构平台,例如:DB2,MSSQL等
- Oracle GoldenGate 数据复制过程如下:
- 利用抽取进程(Extract Process)在源端数据库中读取Online Redo Log或者Archive Log,然后进行解析,只提取其中数据的变化信息,比如DML操作——增、删、改操作,将抽取的信息转换为GoldenGate自定义的中间格式存放在队列文件(trail file)中。再利用传输进程将队列文件(trail file)通过TCP/IP传送到目标系统。
- 目标端有一个进程叫Server Collector,这个进程接受了从源端传输过来的数据变化信息,把信息缓存到GoldenGate 队列文件(trail file)当中,等待目标端的复制进程读取数据。
- GoldenGate 复制进程(replicat process)从队列文件(trail file)中读取数据变化信息,并创建对应的SQL语句,通过数据库的本地接口执行,提交到目标端数据库,提交成功后更新自己的检查点,记录已经完成复制的位置,数据的复制过程最终完成。
但OGG有一个缺陷,做不到全量数据对比!
(3)KETTLE
Kettle是一款国外开源的ETL工具,可以在Windows、Linux、Unix上运行,纯java编写。该工具使用前需要做代码改造,以适用现有的业务场景。
(4)DATAX
DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL、Oracle、HDFS、Hive、OceanBase、HBase、OTS、ODPS 等各种异构数据源之间高效的数据同步功能。DataX采用了框架 + 插件 的模式,目前已开源,代码托管在github。
DATAX底层原理:
- DataX本身作为离线数据同步框架,采用Framework + plugin架构构建。将数据源读取和写入抽象成为Reader/Writer插件,纳入到整个同步框架中。
- Reader:Reader为数据采集模块,负责采集数据源的数据,将数据发送给Framework。
- Writer: Writer为数据写入模块,负责不断向Framework取数据,并将数据写入到目的端。
- Framework:Framework用于连接reader和writer,作为两者的数据传输通道,并处理缓冲,流控,并发,数据转换等核心技术问题。
(5)ADAM STUDIO
阿里云官方描述:ADAM推出Oracle数据库平滑迁云解决方案,覆盖Oracle迁移的全生命周期,包括数据库与应用评估(兼容性、关联关系、性能、风险点、应用改造点)、转换(转换不兼容点、引擎特征优化转换)、结构迁移、数据迁移、一致性校验、SQL仿真回放、割接、优化。
这里简单聊一下在测试过程中,对该工具的总结:
1.首先该工具需要搭建一套adam环境,部署一套mysql数据库存储迁移数据,迁移操作以web界面的形式呈现,操作相对较为简单
2.ADAM有一个个人认为非常实用的功能,在分析完结构对象在源端与目标端迁移前后兼容性后,会出一份兼容性报告,报告较为详细,包含了所有的对象的个数,不兼容对象的创建语句(如sequence、存储过程、merge into等),甚至包含这些对象的一些兼容性改写方案,对于无法兼容的对象,也有做标记,便于DBA及研发同学核对。
(6)DTS
- 数据传输服务DTS(Data Transmission Service)是阿里云提供的实时数据流服务,支持RDBMS、NoSQL、OLAP等。
- DTS自身可以实现结构迁移和数据迁移,结合迁移改造工作量、数据验证几个方案,测试比对各个迁移工具,最终本次oracle迁移mysql使用了DTS工具。
- DTS工具可以实现数据验证功能,但是DTS仅能含主键或者唯一键约束的表,同时仅验证的是主键这一列的内容一致,DTS即认为数据一致,仍然做不到全量的数据验证
关于DTS同步数据的原理可以类比于OGG,给大家放一张图,如需要深入了解,可以看本人的这篇博客【阿里云DTS原理】
https://blog.youkuaiyun.com/qq_44714603/article/details/105205150
这里补充几个在DTS在迁移过程中需要改造的几个点:
- Default 为Sysdate需要转换为now(),(测试期间,改为CURRENT_TIMESTAMP,这两者是一样的。)
- 存在Specified key was too long; max key length is 3072 bytes,需要修改列长度
- 补齐丢失的唯一索引
- 分区表全部不兼容,需要改写
- 存储过程不兼容,需要改写
- 外键约束不兼容,需要改写
- (mysql中数据库对象不如oracle的多,所以针对自家oracle数据库中的对象,如果oracle中的对象在mysql中没有对应的,一般需要改写)
五、对象兼容性改写
对于对象兼容性这部分,大家需要兼顾人员分配。
- 相关数据库对象统计,研发与DBA都可以做,这里建议DBA做,因为DBA对数据库的权限相对较高,建议这里DBA与研发协作,互相比对对象统计结。
- 相关不兼容的数据库对象改写,这里建议研发同学执行,DBA协助技术支持。其实改写SQL是DBA的基本技能,这里建议研发同学改写,DBA同学协助的原因是,在一个项目人员细分较为明确的场景下,往往研发同学对业务更加了解&#x