目录
介绍
部署环境
下载相应的数据库驱动
启动命令:
部署
先建转换(A库a表到B库a表)后创建作业(定时任务)
编辑具体业务:
多表同步
创建作业(定时任务)
增量同步
1.使用同步标识(sync_flag)字段实现增量同步
2.使用修改时间(modify_date_time)字段实现增量同步
3.使用修改时间(modify_date_time)字段+动态表名实现增量同步
介绍
kettle 是纯 Java 开发,开源的 ETL工具,用于数据库间的数据迁移 。可以在 Linux、windows、unix 中运行。有图形界面,也有命令脚本还可以二次开发。
官网地址:Kettle中文网 – Kettle安装、Kettle使用、Kettle中文,集成包下载:https://sourceforge.net/projects/pentaho/files/ ,源代码下载:GitHub - pentaho/pentaho-kettle: Pentaho Data Integration ( ETL ) a.k.a Kettle
部署环境
基于Java开发的jdk1.8环境。
下载相应的数据库驱动
由于 kettle 需要连接数据库,因此需要下载对应的数据库驱动。
例如 MySQL 数据库需要下载 mysql-connector-java.jar,oracle 数据库需要下载 ojdbc.jar。下载完成后,将 jar 放入 kettle 解压后路径的 lib 文件夹中即可(需要重启kettle)。
自己测试的为:mysql-connector-java-5.1.46.jar(用mysql-connector-java-5.1.39.jar这个包碰到编码问题,不确定是不是这个包引起的)
启动命令:
Windows:Spoon.bat
Mac:spoon.command 或 spoon.sh
部署
下载下来最新的集成包:pdi-ce-9.1.0.0-324.zip,解压后将数据库驱动包放进去。启动服务。
初始化界面:
启动成功后主界面:
注:建立一个数据库链接,将kettle上操作、配置保存到数据库中,下次再编辑时可直接读取。
Windows测试时遇到文件编码问题,这里建议统一设置。
1.数据库创建的kettle数据库的编码字符集使用:utf8。排序规则:utf8_general_ci
2.kettle链接数据库时配置characterEncoding=utf-8
3.MySQL的jar包升级,mysql-connector-java-5.1.39.jar 升级为 mysql-connector-java-5.1.46.jar,经查找资料,39的包确实存在编码问题...
以上操作如果还有编码问题则将保存的 转换文件命名、表输入、插入/更新改为英文即可。
点击右上角的connect
点击链接后刚刚配置的kettle数据库就会创建R_开头的46张表,后续其他配置变会保存到此数据库中。
先建转换(A库a表到B库a表)后创建作业(定时任务)
双击:输入 --> 表输入。输出 --> 插入 / 更新。command+s 保存当前步骤。
效果图:
编辑具体业务:
MES数据库mes_board表往PCN数据库的mes_board表同步。
运行结束后,可以在下方看到运行结果,其中有日志,数据预览等。可以看到一共读取了多少条数据,插入更新了多少数据等等。
这样就完成了一个最简单的转换,从MES库的一个表取数据,插入更新到PCN库的另一个表。
多表同步
表输入和表输出都是针对表的操作,如有很多表需要同步可按照下面这种方式进行批量处理,按照业务类型来创建转换文件,效果如下:
创建作业(定时任务)
从左侧依次拖动 START 、转换、成功到右侧,并用线连接起来。
双击Start编辑定时任务,这里配置的是每5秒钟执行一次。
双击转换,选择之前新建的那个转换。
点击运行,就能运行这次作业,点击停止就能停止。在下方执行结果,可以看到运行的日志。
这样就完成了一个最简单的作业,每隔5秒钟,将源表的数据迁移到目标表。
增量同步
1.使用同步标识(sync_flag)字段实现增量同步
字段说明:
sync_flag:10未同步、20已同步、30同步失败
逻辑说明:
1、查询pcn库的if_package_detail表未同步数据(《记录数量限制》要输入0,具体原因看上边解释)。
2、将查询的结果输出到mes库的if_package_detail表里,勾选《使用批量插入》(如果表字段不一致就勾选《指定数据库字段》,然后在数据库字段里做关系映射)。
3、将插入完毕后的数据获取指定列,拿到ID的值。
4、
将ID的值以参数的形式传入到SQL脚本中,使用 ? 来代替(如有多个字段需要传入,就按照步骤3里的顺序依次在SQL中获取)。
使用引号把 ? 包裹起来,将传入进来的值当做字符串处理。
勾选《执行每一行》、《变量替换》。
点击《获取字段》按钮,将步骤3的字段传入进来。
效果图:
具体实现效果截图:
2.使用修改时间(modify_date_time)字段实现增量同步
注:新增一张配置表,将表名和最新一条数据的修改时间放入到表中,保证表数据object_code唯一、必填,sync_time必填。
逻辑说明:
1、查询mes库的配置表(mes_pcn_sync_cfg_kettle),拿到需要同步的表名和对应的上次同步数据的时间(《记录数量限制》要输入0,具体原因看上边解释)。
2、获取指定列,拿到上次同步数据的时间。
3、根据时间查询对应业务表需要同步的数据。勾选《允许简易转换》、《替换SQL语句里的变量》、选择《从步骤插入数据》为上一步的《字段选择》、《执行每一行》。
4、将查询的结果输出到mes库的if_package_detail表里,勾选《使用批量插入》(如果表字段不一致就勾选《指定数据库字段》,然后在数据库字段里做关系映射)。
5、将插入完毕后的数据获取指定列,拿到修改时间(modify_date_time)的值。
6、
将修改时间(modify_date_time)的值以参数的形式传入到SQL脚本中,使用 ? 来代替。
使用引号把 ? 包裹起来,将传入进来的值当做字符串处理。
勾选《执行每一行》、《变量替换》。
点击《获取字段》按钮,将步骤5的字段传入进来。
表结构与数据:
CREATE TABLE `mes_pcn_sync_cfg_kettle` (
`id` bigint(20) NOT NULL,
`create_date_time` varchar(255) DEFAULT NULL,
`create_user` varchar(255) DEFAULT NULL,
`is_deleted` int(11) DEFAULT NULL,
`is_valid` int(11) DEFAULT NULL,
`modify_date_time` varchar(255) DEFAULT NULL,
`modify_user` varchar(255) DEFAULT NULL,
`organize_code` varchar(255) DEFAULT NULL,
`object_code` varchar(255) NOT NULL,
`object_name` varchar(255) DEFAULT NULL,
`sync_time` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_object_code` (`object_code`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci;INSERT INTO `impp_i3_mes`.`mes_pcn_sync_cfg_kettle`(`id`, `create_date_time`, `create_user`, `is_deleted`, `is_valid`, `modify_date_time`, `modify_user`, `organize_code`, `object_code`, `object_name`, `sync_time`) VALUES (1, '2021-04-28 16:00:00', 'sss', 2, 1, '2021-04-28 16:00:00', 'sss', '10003', 'if_package_detail', '接口包装表', '2021-05-10 14:56:23');
效果图:
具体实现效果截图:
3.使用修改时间(modify_date_time)字段+动态表名实现增量同步
注:这里要用到变量功能、结合job完成数据传递。
第一个转换:
1、查询配置表,获取需要同步的表名和对应的上次同步数据的时间。
2、将表名和时间设置为变量:OBJECT_CODE、SYNC_TIME。
第二个转换:
1、查询数据,表明和条件使用变量读取,固定写法:${变量名称},勾选《替换SQL语句里的变量》。
2、将结果输出到文件中(也可以结合上边的逻辑,输出到对应表中,然后在修改对应的同步时间即可)。