ETL之kettle数据同步

时间:2022-12-29 11:07:09

一.同步思路

Mysql数据导入oracle中思路:首先在oracle中建一张和mysql中表中字段一样的表(oracle中的表字段要包含mysql中表的字段),然后再在oracle中建一张只存id的表,当使用kettle的job时,首先执行一个sql查询oracle中的id表的id的最大值(因为mysql中的id设置是自增长的),然后表输入的时候执行sql查询mysql中要导入的表的数据,这里的sql加上条件where id>(oracle中id表的最大值) order by id,这样做是防止下一次执行job时以前已经导入的数据不用再次导入。然后kettle会将mysql查询出来的数据插入到oracle中,同时也将id插入到oracle中的id表中.

 

二.使用方法

1.首先下载解压后修改D:\kettle\data-integration\simple-jndi\jdbc.properties文件

ETL之kettle数据同步

这里的hyw是msql数据库,procloud是oracle数据库,需求是将mysql中的数据转到oracle中去,驱动是需要自己下载jar包放到D:\kettle\data-integration\libswt\win64(这里电脑是64位的),不然测试连接是不会成功的。

ETL之kettle数据同步

然后在转换》》DB连接建两个数据库,一个源数据库(hyw),一个目标数据库(procloud)

ETL之kettle数据同步

2.接下来在核心对象中拖入表输入,表输出,字段选择

ETL之kettle数据同步

表输入配置的是源数据库,在表输入之前我们设置再次设置一个表输入2,用于查询目标数据中的最大值,防止下次数据导入时起冲突和增量数据。(表输入->字段选择用”复制”)

 

表输入2的配置(双击表输入2):

ETL之kettle数据同步

这里查询oracle中id表中的最大值,用于做下次插入标记.

 

表输入:

ETL之kettle数据同步

这里的问号?代表变量,然后勾选替换sql语句中的变量和执行每一行,从步骤插入数据选择上一步配置的表输入2,就可以获得表输入2中的最大值.

 

字段选择:

ETL之kettle数据同步

点击列映射,

ETL之kettle数据同步

Add两边数据库的字段一一对应.

 

表输出:

ETL之kettle数据同步

这里的目标表是oracle中的表,是需要从mysql中的表中的数据导入进来.

 

表输出2:

ETL之kettle数据同步

这里的表是数据导入成功时,将已经导入进的id导入到oracle中存id的表中,记录所有已经导入的id,下次再次进行时,就只用查询最大值,从>最大值开始导入。起到一个标记的作用.

到此我们再保存这个转换,文件是已.ktr结尾的。

 

接下来在文件》》新建》》作业来新建一个job

 ETL之kettle数据同步

这里我start的时候建立了3个并行任务,并行任务的设置如下图:

ETL之kettle数据同步


然后双击转换:

ETL之kettle数据同步

选择刚才我们保存的krt文件,第一次运行会报错,第二次重复选择就行了。

ETL之kettle数据同步

由于这里的需求是mysql的三个表导入到oracle中的三张表,所以建立了3个转换,并且是并行的任务。每一个转换执行一张表。(其实也可以全部放到一个转换中).

 

然后保存(job文件后缀是.kjb)点击三角就可以运行这个job了


最后可以将这个作业(job)制作成一个为bat文件


ETL之kettle数据同步

然后可以在window中“任务计划程序”设置定时,每隔多少时间去将mysql中的数据导入到oracle中。

ETL之kettle数据同步

到此,数据就可以执行同步了。

 

若要实现在MYSQL 表1à(导入)ORACLE表2 à(执行存储过程) ORACLE表3

若要实现从表1数据同步到表2中,然后表2执行一个存储过程将数据导入到表3中,那么可以在kettle“转换”中配置一个执行存储过程(如下图):

ETL之kettle数据同步