一、使用时间戳抽取数据原理
所使用的时间戳字段必须是按时间入库的字段,不能是业务数据的时间戳字段。比如入库时间是递增的,业务里面的某一个时间戳字段不一定就是递增的。
数据库之间基于时间戳同步数据,原理是通过判断数据采集或者更新时间与某一个基准时间对比,把数据在时间的维度进行排序,同步变化了的数据,具体如图所示:
A表是主表,B表是附表,中间表:时间戳表Time记录同步的基准时间。它的工作流程如下:
1.Time表的原始记录是(T0,T0),一旦开始同步,它会变成(T0,Now);
2.取出A表中 lastupdatetime >=T0 and lastupdatetime < Now 的所有记录,更新到B表;
3.同步完毕,Time表变为(Now,Now)。
4.重复以上步骤,Now的时间不断向前迈进。
可以看出:
1.基于时间戳的同步可以实现A表的insert,update,等动作,但是如果A表做了物理删除,B表是无法同步的,这种问题如何解决?
2.Now这个时间一般是sysdate,它来自于服务器系统时间,如果服务器之间时间不同步,后期会存在一些麻烦的事情。
3.如果是源表通过sysdate来获取当前的更新时间,sysdate时间与用户真正提交时间有一个时间差(T),如果作业更新的频率比较快,有可能由于这个时间差而漏掉这个数据。其实,源表的更新时间是用户提交的时候才记录,那就不存在时间差。
二、Kettle基于时间戳的增量同步操作
下面这个例子复杂一点,假设A表具有两个时间字段:create_date和lastupdatetime
工作流程如下:
1.工作启动
2.初始化时间戳表,把当前系统时间写入时间戳表的 current_load字段,时间戳表last_load字段保存着上一次同步时间
3.取出时间戳表的两个时间,上次时间和当前时间(取两次是以为后面比较条件有四个参数?),跟A表的时间进行比较,
取出:数据创建时间大于等于上次同步时间和数据创建时间小于当前同步时间的记录,或者数据更新时间大于上次同步时间和数据更新时间小于当前同步时间的记录。但是,采用大于时间戳的方式同步就会遗漏数据,采用等于时间戳的方式同步就会重复同步数据。
4.同步成功后,要把时间戳表的last_load值更改为当前同步时间。
作业中一共有3个转换:
转换一:把Kettle所在服务器的系统时间更新进入时间戳表的current_load字段
转换二:从两个表输入信息,一个是时间戳表,一个是A表。因为A表需要用时间戳来做条件过滤数据,其SQL语句具有四个参数(?),所以,时间戳表的SQL语句取了两次数据。A表使用了时间戳的数据,所以下面几个选项需要打勾。如下图所示:
B表的更新,用ID(主键)作为查询条件即可。
转换三:同步完毕,时间戳的last_load时间要更改为当前时间,为下一次的同步做准备。
三、同步结果