Oracle数据库迁移到MySQL的需求调研:
1、可以实现迁移的方式:
1、商业软件cloudcanal;
2、Oracle自带的OGG;
3、datax等这类etl抽数工具;
4、oracle spool结合MySQL load实现数据迁移;
2、差异对比:
1、cloudcanal
缺点:开源版本需要90天手动续费,社区免费版本最多支持5 条任务,每个任务最多1000 张表;全量同步不是一致性的,换句话说是分批通过多个事务完成数据抽取;
优点:支持表结构迁移和同步,支持全量和增量数据同步,支持表结构映射,CloudCanal提供了数据校验和订正功能,可以在全量同步完成后,对源端和目标端的数据进行校验,逐字段对比,并订正差异数据,从而确保数据的一致性;
2、datax 当表特别多的时候,操作比较繁琐,需要一个表一个表的配置,所以当表太多的场景不适用,并且DataX在进行全量同步时,读取的数据并不一定是在一个单一的事务内完成的,全量同步不是一致性的;增量同步需要依赖于时间戳字段或递增字段来识别新增或变化的数据。
3、oracle spool和MySQL load对于大量数据的迁移,spool命令可以高效地导出数据到文件中,而MySQL的load命令则可以快速地将文件中的数据加载到数据库中,但是当表个数过多的时候,操作比较繁琐,所以比较适合个别大表的迁移;
4、Oracle ogg,官方自带的迁移软件,支持异构的迁移,通用性高,支持全量同步以及增量同步,不需要像datax那样借助某个字段来识别新增或变化的数据,读取redo来实现增量同步,但是不支持表结构迁移,需要提前在目标端创建好表结构,并且oracle到MySQL增量同步过程中不支持ddl的同步;
综合评估,重点调研ogg和cloudcanal,本文重点讲解ogg的原理和全量同步相关配置
二、Oracle ogg的原理和注意事项
1、ogg相关进程介绍:
1)、manger:Manager进程是GoldenGate的控制进程,运行在源端和目标端上。它主要作用有以下几个方面:
启动、监控、重启Goldengate的其他进程,报告错误及事件,分配数据存储空间,发布阀值报告等。在目标端和源端都有且只有一个manager进程。
2)、extract:运行在数据库源端,负责从源端数据表或者日志中捕获数据。
extract的作用可以按照阶段来划分为:
初始时间装载阶段:Extract进程直接从源端的数据表中抽取数据;
同步变化捕获阶段:初始数据同步完成以后,Extract进程负责捕获源端的redo后者归档日志,以便于获取数据的变化(DML和DDL);
3)、Pump:运行在数据库源端,其作用是将源端产生的本地trail文件,以数据块的形式通过TCP/IP 协议发送到目标端,这通常也是推荐的方式。
pump进程本质是extract进程的一种特殊形式,如果不使用trail文件,那么extract进程在抽取完数据以后,直接投递到目标端,生成远程trail文件。
4)、Collector:它运行在目标端,其任务就是把Extract/Pump投递过来的数据重新组装成目标端自己的trail文件。该进程不需要引起我的关注,因为在实际操作过程中,无需我们对其进行任何配置,对我们来说它是透明的。
5)、Replicat:通常我们也把它叫做应用进程。运行在目标端,是数据传递的最后一站,负责读取目标端trail文件中的内容,并将其解析为DML或 DDL语句,然后应用到目标数据库中。
2、注意事项和原理:
1、全量同步非一致性同步,故全量同步期间需要停服;
2、OGG在Oracle迁移MySQL的场景下不支持DDL语句同步,因此表结构迁移完成后到数据库切换前尽量不要再修改表结构。但是Oracle到Oracle的同构同步是支持ddl同步的;
3、源端Oracle
开启附加日志和强制日志:
1)开启force logging后,Oracle数据库将记录 除 临时表空间或临时回滚段外的所有操作,并忽略类似NOLOGGING之类的指定参数,可以确保Oracle数据库中的所有操作都生成日志信息,并将其写入到联机重做日志文件中,保证Oracle GoldenGate可以捕获变更数据;但是开启force logging可能会影响数据库的性能;
2)默认情况下,Oracle事务日志中只会记录修改的列信息和rowid ,不记录唯一键或主键(ogg需要借助主键或者唯一键来完成上下游数据的匹配), 开启附加日志后,redo会记录完整的行数据或主键信息(即使主键没有被修改),注意开启附加日志可能会对数据库的性能产生一定影响,因为它增加了日志的生成和写入操作;
注意只需要先开启数据库最小的附加日志,当你在ggsci中执行ADD TRANDATA liuwenhe.*的时候,就会自动检查liuwenhe下的所有表是否已经开启了必要的附加日志,针对无主键和唯一键的表会发出警告( WARNING OGG-00869 ),建议手动添加该表所有列的附加日志;
ALTER TABLE table_name ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
4、Oracle GoldenGate实现数据复制是基于逻辑变化复制(Logical Change Record, LCR)的,而不是简单的基于SQL语句的复制。
逻辑变化复制需要记录数据行级别的变更信息,包括哪些列被更新、插入或删除,以及变更前后的数据值等。这些信息是Oracle GoldenGate在复制数据时必需的,而附加日志正是用于记录这些额外信息的;
5、如果配置了多个抓取进程和多个pump进程,相信很多人会有一个疑问?如何辨别抓取进程和pump进程对应关系呢?也就是说如何找到某个抓取进程的pump进程是谁?
首先介绍pump进程的启动
1)首先配置pump进程;
GGSCI> edit param pump_liu
extract pump_liu
passthru
userid ogg, password ogg
rmthost target_host_ip mgrport target_mgr_port
rmttrail /path/to/target/dirdat/ts
table liu.table_name;
2)添加pump进程的时候会指定需要读取的源端trails文件,这样就和抓取进程关联起来
GGSCI> add extract pump_liu, exttrailsource ./dirdat/liu
3)启动pump进程
GGSCI>start extract pump_liu
但是已经运行的抓取进程和pump进程,你查看参数配置是无法直接判断出关联关系的,因为pump进程里面没有指定对应的抓取进程的名字,抓取进程配置中也没有对应的pump进程的名字,因为这俩进程是解耦的,一个负责读取redo转换成trails文件,然后pump进程去拉去trails文件并发送到目标端。
那该怎么找到extract和pump的关系呢?
1)可以通过查看pump日志:
GGSCI (javadb01) 3> view report pump_liu
如下关键字Opened trail file可以看出该pump进程读取的trails文件,
2023-03-02 18:40:29 INFO OGG-02243 Opened trail file ./dirdat/b1000000000 at 2023-03-02 18:40:29.826507
2)查看抓取进程的参数配置:
exttrail ./dirdat/b1 表示该抓取进程的本地trail文件的位置!这里给前面pump的日志中的一样,就说明他们两是一对;
GGSCI (javadb01) 6> view params ext_liu
extract ext_liu
TRANLOGOPTIONS BUFSIZE 4096000
TRANLOGOPTIONS INCLUDEREGIONID
ddl include all
ddloptions addtrandata, report
exttrail ./dirdat/b1
table liu.*;
6、源端抓取进程和pump进程的命名规范,为了能快速定位到某个extract进程对应的pump进程,强烈建议规范进程名字,例如实现同步liuwenhe这个schema的数据,
抓取进程:ext_liuwenhe;
pump进程:pump_liuwenhe;
7、ogg不支持表结构迁移
我们使用sqlines开源工具完成Oracle到MySQL的表结构转换:
https://www.sqlines.com/oracle-to-mysql ----官方文档地址
总结:ogg实现Oracle到MySQL的同步,可以停服完成数据库全量同步,然后借助sqlines开源工具完成Oracle表结构向MySQL表结构转换,表结构转换后需要进一步优化,目前看可以满足需求,接下来将会介绍具体的操作步骤;