这个实验主要思想是在创建数据库表的时候,

通过增加一个额外的字段,也就是时间戳字段,

例如在同步表 tt1 和表 tt2 的时候,

通过检查那个表是最新更新的,那个表就作为新表,而另外的表最为旧表被新表中的数据进行更新。

实验数据如下:

mysql database 5.1

test.tt1( id int primary key , name varchar(50) );

mysql.tt2( id int primary key, name varchar(50) );

快照表,可以将其存放在test数据库中,

同样可以为了简便,可以将其创建为temporary 表类型。

数据如图 kettle-1

kettle-1

============================================================

主流程如图 kettle-2

kettle-2

在prepare中,向 tt1,tt2 表中增加 时间戳字段,

由于tt1,tt2所在的数据库是不同的,所以分别创建两个数据库的连接。

prepare

kettle-3

在执行这个job之后,就会在数据库查询的时候看到下面的字段:

kettle-4

然后, 我们来对tt1表做一个 insert 操作 一个update操作吧~

kettle-5

在原表上无论是insert操作还是update操作,对应的updateTime都会发生变更。

如果tt1 表 和 tt2 表中 updateTime 字段为最新时间的话,则说明该表是新表 。

下面只要是对应main_thread的截图:

kettle-6

在这里介绍一下Main的层次:

Main

START

Main.prepare

Main.main_thread

{

  START

  main_thread.create_tempTable

  main_thread.insert_tempTable

  main_thread.tt1_tt2_syn

  SUCCESS

}

Main.finish

SUCCESS

在main_thread中的过程是这样的:

作为一个局部的整体,使它每隔200s内进行一次循环,

这样的话,如果在其中有指定的表 tt1 或是 tt2 对应被更新或是插入的话,

该表中的updateTime字段就会被捕捉到,并且进行同步。

如果没有更新出现,则会走switch的 default 路线对应的是write to log.

继续循环。

首先创建一个快照表,然后将tt1,tt2表中的最大(最新)时间戳的值插入到快照表中。

然后,通过一个transformation来判断那个表的updateTime值最新,

来选择对应是 tt1表来更新 tt2 还是 tt2 表来更新 tt1 表;

main_thread.create_tempTable.JOB:

main_thread.insert_tempTable.Job:

PS: 对于第二个SQL 应该改成(不修改会出错的)

set @var1 = ( select MAX(updatetime) from tt2);

insert into test.temp values ( 2 , @var1 ) ;

因为conn对应的是连接mysql(数据库实例名称),

但是我们把快照表和tt1 表都存到了test(数据库实例名称)里面。

在上面这个图中对应的语句是想实现,在temp表中插入两行记录元组。

其中id为1 的元组对应的temp.lastTime 字段 是 从tt1 表中选出的 updateTime 值为最新的,

id 为2的元组对应的 temp.lastTime 字段 是 从 tt2 表中选出的 updateTime 值为最新的 字段。

当然 , id 是用来给后续 switch 操作提供参考的,用于标示最新 updateTime 是来自 tt1 还是 tt2,

同样也可以使用 tableName varchar(50) 这种字段 来存放 最新updateTime 对应的 数据库.数据表的名称也可以的。

main_thread.tt1_tt2_syn.Transformation:

首先,创建连接 test 数据库的 temp 表的连接,

选择 temp表中 对应 lastTime 值最新的所在的记录

所对应的 id 号码。

首先将temp中 lastTime 字段进行 降序排列,

然后选择id , 并且将选择记录仅限定成一行。

然后根据id的值进行 switch选择。

在这里LZ很想使用,SQL Executor,

但是它无法返回对应的id值。

但是表输入可以返回对应的id值,

并被switch接收到。

下图是对应 switch id = 1 的时候:即 tt1 更新 tt2

注意合并行比较 的新旧数据源 的选择

和Insert/Update 中的Target table的选择

下图是对应 switch id = 2 的时候:即 tt2 更新 tt1

注意合并行比较 的新旧数据源 的选择

和Insert/Update 中的Target table的选择

但是考虑到增加一个 column 会浪费很多的空间,

所以咋最终结束同步之后使用 finish操作步骤来将该 updateTime这个字段进行删除操作即可。

这个与Main中的prepare的操作是相对应的。

Main.finish

这样的话,实验环境已经搭建好了,

接下来进行,实验的数据测试了,写到下一个博客中。

当然,触发器也是一种同步的好方法,写到后续博客中吧~

时间戳的方式相比于触发器,较为简单并且通用,

但是 数据库表中的时间戳字段,很费空间,并且无法对应删除操作,

也就是说 表中删除一行记录, 该表应该作为新表来更新其余表,但是由于记录删除 时间戳无所依附所以无法记录到。

转载于:https://www.cnblogs.com/inuyasha1027/p/Kettle_update_timestamp.html

kettle中通过 时间戳(timestamp)方式 来实现数据库的增量同步操作(一)相关推荐

  1. kettle获取当前日期_kettle中通过 时间戳(timestamp)方式 来实现数据库的增量同步操作(一)...

    这个实验主要思想是在创建数据库表的时候, 通过增加一个额外的字段,也就是时间戳字段, 例如在同步表 tt1 和表 tt2 的时候, 通过检查那个表是最新更新的,那个表就作为新表,而另外的表最为旧表被新 ...

  2. Java中获取时间戳的方式

    1.System.currentTimeMillis() System类中的currentTimeMillis()方法是三种方式中效率最好的,运行时间最短. 开发中如果设计到效率问题,推荐使用此种方式 ...

  3. mysql中日期时间戳timestamp使用小结

    timestamp时间戳类型在mysql数据库中比较常见,但是我们很容易忽视它的一些特征,这个我在面试中吃过亏,这里对他的一些用法和特点补充一下.也让自己加深印象.一般来说,我们使用日期,一般采用da ...

  4. java timestamp时间戳_求助!java中关于时间戳Timestamp的问题

    代码如下:GregorianCalendargcal=newGregorianCalendar();//获得当前时间DateFormatdf=DateFormat.getDateTimeInstanc ...

  5. impala中的时间戳 TIMESTAMP类型用法(转载网上电子书)(不是我原创)

    查看一个日期是第几周和星期几 日期计算 查询指定日期是多少号 查询两个日期差了多少天 查询当前时间 时间戳常量和隐式转换

  6. 用Kettle的一套流程完成对整个数据库迁移

    转自:  https://blog.csdn.net/maenlai0086/article/details/80829143 Kettle日常使用汇总整理:https://www.cnblogs.c ...

  7. php 时间戳存储 原因,将php文件中的unix时间戳存储到mysql中(store unix timestamp from php file into mysql)...

    将php文件中的unix时间戳存储到mysql中(store unix timestamp from php file into mysql) 现在我有这个代码: $mysqldate = date( ...

  8. php中的时间戳_PHP 时间戳 timestamp

    PHP 时间戳 UNIX 时间戳(timestamp)是 PHP 中关于时间日期一个很重要的概念,它表示从 1970年1月1日 00:00:00 到当前时间的秒数之和. PHP提供了内置函数 time ...

  9. java 时间戳 对比_Java中获取时间戳的三种方式对比实现

    Java中获取时间戳 三种方式对比 最近项目开发过程中发现了项目中获取时间戳的业务.而获取时间戳有以下三种方式,首先先声明推荐使用System类来获取时间戳,下面一起看一看三种方式. 1.System ...

最新文章

  1. 快速体验 Sentinel 集群限流功能,只需简单几步
  2. 每天一道LeetCode-----对序列进行排序,要求nums[0] nums[1] nums[2] nums[3] ....
  3. jspdf html转换pdf,使用jspdf将HTML转换为pdf时出错
  4. SPASVO 软件生命周期管理 ALM V2.1 正式发布!
  5. 设计模式 — 简单工厂模式
  6. java -cp命令使用
  7. Android8.1源码编译实践(Mac)
  8. wincc服务器客户端用虚拟机,什么情况下用wincc服务器与客户端
  9. Jenkins任务配置详解,支持ssh远程部署,maven聚合项目,springboot
  10. mysql 查询关键词顺序
  11. Atitit fms Strait (海峡) lst 数据列表目录1. 4大洋 12. 著名的海大约40个,总共约55个海 13. 海区列表 23.1. 、波利尼西亚(Polynesia,
  12. 怎么提高c语言编程能力,如何才能提高用C语言编程的能力
  13. uniapp跳转指定小程序
  14. vs2010 solidworks2015 c# add-in模板 二次开发
  15. 怎么提取图片上的文字?这三个小妙招,让你事半功倍!
  16. LeetCode笔记:Biweekly Contest 37 比赛记录
  17. windows环境部署django项目(可部署不同版本的django)
  18. 读懂SIEM建设?看这篇就够了!
  19. 算法【链表】 | 【链表尾部重合问题】
  20. 华为实验——两核心两接入一路由配置

热门文章

  1. HTC与酷派 不是冤家不聚头
  2. 试水区块链出版?纽约时报在招人了
  3. ubuntu下配置eclipse3.3
  4. Android中使用ContentProvider进行跨进程方法调用
  5. 修改RHEL7/centos7网卡为eth0
  6. 如何确定一个IAR工程所使用的IAR版本
  7. [JAVAWEB实战篇]---Hibernate实现级联删除
  8. 谷歌Analytics添加到您的SharePoint 2010网站的2种方法
  9. 石川es6课程---17、ES7 预览
  10. dubbo中使用动态代理