关于kettle时间戳增量更新

  之前看到的一篇文章Kettle实现数据实时增量同步,这位大佬提出了 时间戳增量回滚同步的一种方式,我是根据这篇文章之上进行探索的。

但是遇到了一些问题,这里进行一下记录:

  1. 只能同步往前{ROLL_BACK_DAYS} day这段时间内的删除操作,因为回滚了一段时间{ROLL_BACK_DAYS} day,作者也声明了这点;
  2. 也只能同步往前{ROLL_BACK_DAYS} day这段时间内的删除操作,为什么呢?因为我们如果真的考虑以操作时间作为时间戳,那么在上次更新过后,即TIME_STAMP这个时间之后,源表里更新了某条数据,这条数据原来的时间戳在TIME_STAMP-{ROLL_BACK_DAYS} day 之前,那么从源表里的这条记录同时也将自己的时间戳send_time更新为当前时间,那么对比记录这步之后,这条记录就归为了new,即成为了多出来的数据,而这条数据在目标表里是有记录的,但是new跟着的操作时间上是表输出,那么就会造成主键重复但是却执行了插入这条数据的操作,虽然在作者的这个例子里面没有错误,但是我认为他其实是进行了替换,mysql是这样,但是Oracle估计就不一定会正确。而且对于主键重复插入这点,不同数据库不同的设置会有不同的结果,但是一般情况下这是不该发生的事情,会报错而导致job停止。

作者提出的这些其实本来在他回滚的时间段内是没有错误的,可能也是其业务需求刚好可以满足,但是对于我们自己需求,可能就无法满足。

而如果去掉了回滚这一步,对比记录的结果flagid就只有new,而不会有changeddeleted这两种结果。所以两表抽取数据进行比对似乎就失去了意义,与直接从源表数据进行时间戳的截取,而后面直接对目标表后面接“插入更新”似乎没有多大的区别,甚至效率更低。

对于2,这一点我觉得只有用“插入更新”是最安全的,但是作者也提出说,“插入更新”会比较慢。所以对于这一点我也没有进行过验证,只是提出这样的想法。这里做一下记录。

补充内容:关于数据抽取和同步。

在一些复杂的场景下,使用kettle进行同步。两个表的结构可能是完全不一致的,甚至某些字段根本没有,比如我们为了同步目标表,需要对源数据库里的表进行多表关联,数据格式转换decode,date_form等等,但是源表里的业务表的主键甚至和目标表的主键是不一致的,这种情况下,若同步所有字段则自己生产的目标表的主键有可能和别人真实目标表里的主键冲突,若目标表的主键是自动生成的UUID等,则可以在获取比对数据之前就过滤掉目标表的主键让其自动生产。同时需要考虑查询的组合字段同可以确定来源数据和目标表的一行数据,即至少同时可以成为两表的主键。

当然理解业务场景是是最主要的。

你可能感兴趣的:(kettle数据同步,kettle,etl数据同步,时间戳增量更新)