本文介绍一种从Oracle到Dws进行数据迁移方式。数据迁移分为两步,全量迁移和增量迁移。全量迁移是指将源端的全部或部分数据一次性的迁移到目标端的过程,全量同步采用CDM方案;增量同步是指将指定检查点后的数据库数据增量变化由源数据库同步到目标数据库的过程。
全量数据的导入导出已在前面章节进行了介绍,这里只介绍增量数据迁移。增量数据迁移包含两部分,分别是数据捕获与数据回放。数据捕获指的是捕获到Oracle数据库的数据变化过程,由DRS模块完成,将增量数据同步到DWS的数据回放由Spark程序完成,在MRS作业中执行,整个过程如下图所示。整体思想基于Kafka Topic,屏蔽捕获端与回放端区别,实现各种异构数据库间的数据抽取与回放。
数据回放得spark程序原理如下:
1.1 处理增量数据
增量数据从kafka消费到之后按批次放置于HDFS,以以上格式存放于CSV文件中,在原始数据的基础上增加后面蓝色字段来进行解析并进行回放。按照顺序逐条解析CSV文件后,按照不同的op_type将增量数据放入不同的数据结构中存储,包含插入、删除两个数据结构。如果是插入数据,则直接放入插入数据队列中;如果是更新数据,先查插入队列中是否包含op_position中的before数据,若包含则从插入队列中删除,然后将before数据放入删除数据队列中,将after数据放入插入队列中;如果是删除数据,从插入队列去查,如果包含则从插入队列中删除,如果不存在删除标记位,将数据插入删除列队中,如果存在删除标记位,将删除数据插入删除标记队列中。这个是在内存中做的一次数据整合压缩操作。
1.2 数据入临时表
为了数据可以批量导入DWS正式表中,对应内存中的插入、删除数据结构,建立临时表,插入、删除临时表,临时表的结构是正式表除去删除标记位以后的表结构。内存中处理完一个或多个文件后(可通过参数指定一次处理的文件个数)将内存中的数据copy进这三个临时表中。
1.3 数据回放入正式表
数据回放是将临时表中的数据入库到正式表中。 插入表采用merge语法,对比主键有此主键则更新为临时表数据,没有此主键则插入此数据。删除的时候有两个选择:直接删除还是打标记删除。打标记意味着表有一个标志位,专门用来做删除,删除数据的时候只需将此标志位由0置1,增量数据中不需要携带标志位数据。直接删除时只需匹配删除数据,匹配上了就删除。删除表采用delete语法,where条件匹配主键,即删除相同主键的数据,当存在删除标记位时,会将删除标记临时表采用merge语法,对比主键有此主键则更新为临时表数据,并将删除标记位置1,没有此主键则插入此数据,删除标记位同为1。执行的时候,先执行插入表,再执行删除表。
采用这三步即可将Oracle采集到得数据处理过程回放到DWS数据库中,以达到和Oracle数据一致的效果,即一次增量数据迁移过程。