首页 > 编程知识 正文

kettle实现两个数据库同步(kettle数据库实时同步)

时间:2023-05-06 02:36:40 阅读:81252 作者:2579

第一次使用ETL工具提取数据进行同步,搜索后决定使用kettle。 用起来感觉很方便。

这次需要基于小的需求,将旧系统的mysql数据实时传输到新旧系统共存的时期发生的数据到新系统oracle。 由于对实时性的要求不是很高,所以我没有触发器那样的对接,而是单纯地使用kettle进行提取、转换和传输,并定时执行。 记录下这次的操作,试着写下自己遇到的洞吧。

因为旧系统的mysql表很大,所以这次需要根据小的需求,只提取其中两个字段并同时传输。 两个字段都是varchar类型,比较简单。 我尝试过传输mysql的int(11 )和oracle的number,但发现要使两者匹配,需要将oracle的number更改为number ) 10 )。

工具: kettle的pdi-ce-7.0.0.0-25,可以下载到官网上; mysql,甲骨文

思路:首先检查mysql的旧数据和oracle同步的数据,统一转换字段,交给kettle处理。 kettle根据关键字字段和时间戳判断来自mysql的数据对oracle来说是添加、更新、删除还是什么都不做,分别标记识别位,然后一步步判断识别位,最后是oracle字段

整个过程使用kettle分为两部分,一部分是转换,是过程执行的主战场; 另一个作业用于循环执行上次的转换,以获得定时执行的效果。

转换步骤图:

工作流程图:

工作流程图很简单,主要在循环时执行转换,忽略。 这次主要谈转变。

转换首先建立数据库连接,最后说话。

从步骤mysql和oracle查询所有数据,然后传输到下一步骤。

mysql是每次同步的来源,oracle是每次同步的目标。 之所以要调查这两者,是因为下一步要核对两者的数据,判断哪个是增量数据。

B2B测试节点和sro测试节点:

从两者调查的数据统一为两个字段,TASKNO和SAPNO,推送到下一个节点。

步骤2 :合并上一步骤的记录,分析增量数据时,ETL会自动给各数据加上标志字段

关键字段是分析差异数据所依据的字段,而数据字段是所有需要合并和组织的字段,标志被附加在标志字段上。

为了从Mysql同步到oracle,旧数据源选择oracle,新数据源选择Mysql

步骤3 :进一步处理标签和数据,映射增量数据标签

kettle会自动标记上一步。 默认值为deleted、new、changed、identical (意味着什么也不做,实际上标记为空。 我们可以映射到我们自己的标记上,用于下一步的处理。

步骤4 )第一次开始过滤增量标记,开始最初的分支过程处理。

在这次过滤中,将标志字段标记为null的数据,也就是identical所指标记的数据,全部丢弃到空操作中。 这些数据没有任何变化,所以不需要做任何事。

需要进行以下处理的所有变化数据将在下一个检索系统时间丢失。

步骤5 :获取系统时间

获取系统时间的目的是给数据加上时间戳,然后将其保存到目标数据库。 如果不方便保存到目标数据库,也可以放中间表。 无论如何,都可以在下次数据整理时拿到这个值。 这里也有我不知道的事。 我没有从目标数据库中查询这个时间戳。 ETL知道如何找到这个时间戳,哪个应该增加,哪个不行,哪个应该更新。 我不想知道这个。 因为如果不加入系统时间,就会全部删除ETL,对象数据库的数据也会全部增加。 加上这个时间,会稍微更新、删除、添加。 如果

有谁能看到这篇日志记录,烦请告知。

步骤六:第二次过滤增量数据标记。

本次会分离需要新增的数据出来,交给后续处理入库;更新和删除的数据,需要继续下一步的过滤。

上图有两步,从flagfield中过滤出来需要新增的数据,然后抛给分支“准备插入目标数据库”,在这个子流程节点,会将流中的字段(字段名称),转换成数据库中的字段(改名称成),有两个字段flagfield和UPDATE_TIME无需转换,本来就是这个字段,所以无需添加“改名成”列。

之后就是插入数据库。这里有个坑,不要使用“插入”操作功能,要使用表输出。不知道为什么,使用插入操作功能,总会出现少量数据的误差。

步骤七:第三次过滤增量数据标记

本次过滤的是剩下的更新和删除,这两种标记的数据均会被推入数据库中。

在后面就是更新和删除数据库了:

更新数据库:

删除数据库:

以上就是一个流程的执行,如果要循环执行,则要开启一个作业,调用转换,设定定时循环的时间条件即可。

数据库的建立:

数据库的建立比较简单,需要将对应的连接jar放入目录下,百度一搜一大堆。只是在oracle上有点坑就是了。mysql连接比较简单,忽略不讲,oracle里,数据库名称实际指的是数据库对应的 sid,可以到oracle里查询,如果没有权限,建议你从数据库名称开始,后面加0、1、2等,基本上都会试出来。

OVER

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。