1. 建立测试表,插入数据。

use test;  create table t_color (  id int unsigned not null auto_increment primary key,  color varchar(10),  create_date datetime,  last_update timestamp
)  engine=myisam;  insert into t_color (color,create_date) values('black',now()),('green',now()),('red',now()),('blue',now());
select * from t_color;  

2. 建立参数表存储最后一次的抽取时间。

use test;  -- 创建时间戳表
create table cdc_time (
last_load datetime,
current_load datetime) engine=myisam;  -- 初始化数据
insert into cdc_time values ('1971-01-01 00:00:01','1971-01-01 00:00:01');
select * from cdc_time;  

3. 创建初始化时间戳转换

说明:

把current_load时间设置成作业的开始时间。通过“获取系统信息”完成这一功能,在这个步骤里创建一个“系统日期(变)”类型的字段,字段名是sysdate。然后创建一个“插入/更新”步骤,把“获取系统信息”步骤和“插入/更新”步骤连接起来。在“插入/更新”步骤的“更新字段”部分里,用流里的字段“sysdate”去更新表里的字段“current_load”。另外还要设置“用来查询的关键字”部分,把表的“current_load”的条件设置为“is not null”即可。

4. 创建查询变化数据的转换





说明:
从t_color表里抽取数据的查询语句使用开始日期和结束日期,左边闭区间,右边开区间。查询条件类似下面的语句:
(create_date >= last_load and create_date < current_load) or (last_update >= last_load and last_update < current_load)

这里需要两个表输入步骤,一个用来从cdc_time表中抽取时间,另一个从t_color表中抽取需要的数据。另外再看查询条件,可以发现last_load和current_load分别出现两次。就是说在第一个表输入步骤中,这些时间值需要被抽取出来两次。

select   last_load last1,  current_load cur1,  last_load last2,  current_load cur2
from cdc_time;

在t_color表输入步骤里,选中“替换 sql 语句里的变量”,在“从步骤插入数据”下拉列表里选中上个表输入步骤。在select语句里写入下面的查询条件:

where (create_date >= ? and create_date < ?) or (last_update >= ? and last_update < ?)
前一个步骤传来的参数将替换上面语句里的问号,第一个问号的值是last1,第二个问号的值是cur1,等等。
通过比较create_date和last_update的值是否相等,可以判断出是新增的还是更改的数据。
case when create_date = last_update then 'new' else 'changed' end as flagfield
把变更数据输出到文本文件里。

5. 创建更新参数表的转换



说明:

如果转换中没有发生任何错误,要把current_load字段里的值复制到last_load字段里。如果转换中发生了错误,时间戳需要保持不变。把current_load字段里的值复制到last_load字段里需要“执行sql语句”步骤,脚本如下:

update cdc_time set last_load = current_load;

cdc_time表里之所以要有两个字段,是因为在加载过程中,会有新的数据被插入或更新,为避免脏读或死锁的情况,最好给create和update时间戳设定一个上限条件,也就是这里的current_load字段。
6. 创建作业

7. 测试
-- 运行作业
-- 查看diff文件

-- 查看cdc_time表

mysql> select * from cdc_time;
+---------------------+---------------------+
| last_load       | current_load      |
+---------------------+---------------------+
| 2014-12-16 11:10:05 | 2014-12-16 11:10:05 |
+---------------------+---------------------+
1 row in set (0.00 sec)

-- 修改数据

delete from t_color where id=3;
update t_color set color='Grey' where id=1;
insert into t_color (color,create_date) values('Yellow',now());
commit;

-- 运行作业
-- 查看diff文件

-- 查看cdc_time表

mysql> select * from cdc_time;
+---------------------+---------------------+
| last_load       | current_load      |
+---------------------+---------------------+
| 2014-12-16 11:16:02 | 2014-12-16 11:16:02 |
+---------------------+---------------------+
1 row in set (0.00 sec)

8. 总结

基于源数据的CDC要求源数据里有相关的属性列,ETL过程可以利用这些属性列,来判断出哪些数据是增量数据。最常见的属性列有以下两种:

  • 时间戳:这种方法至少需要一个更新时间戳,但最好有两个时间戳:一个插入时间戳,记录数据行什么时候创建;一个更新时间戳,记录数据行什么时候最后一次更新。
  • 序列:大多数数据库都有自增序列。如果数据库表用到了这种序列,就可以很容易识别出新插入的数据。

这两种方法都需要一个额外的数据库表来存储上一次更新时间或上一次抽取的最后一个序列号。在实践中,一般是在一个独立的模式下或在数据缓冲区里创建这个参数表,不能在数据仓库里创建,更不能在数据集市里创建。基于时间戳和自增序列的方法是CDC最简单的实现方式,所以也是最常用的方法。但是它的缺点也是很明显的,主要如下:

  • 区分插入操作和更新操作:只有当源系统包含了插入时间戳和更新时间戳两个字段,才能区别插入和更新,否则无法区分。
  • 删除记录的操作:不能捕获到删除操作,除非是逻辑删除,即记录没有真的删除,只是做了逻辑上的标志。
  • 多次更新检测:如果在一次同步周期内,数据被更新了多次,只能同步最后一次更新操作,中间的更新操作都丢失了。
  • 实时能力:时间戳和基于序列的数据抽取一般适用于批量操作,不适合于实时场景下的数据加载。

在Kettle里使用时间戳实现变化数据捕获(CDC)相关推荐

  1. CDC(变化数据捕获)同步技术详解

    一.CDC(Change Data Capture)变化数据捕获概念 1.变化数据捕获简称CDC,抽取处理需要重点考虑增量抽取,假设一个数据仓库系统,在每天夜里的业务低峰时间从操作型源系统抽取数据,那 ...

  2. 数据库实时同步利器——CDC(变化数据捕获技术)

    在进行数据ETL过程中,我们经常需要通过周期性的定时调度将业务数据按照T+1的方式同步到数据仓库中,进行数据分析处理,最终通过BI报表展示给最终用户.但这种方式实时性较差,用户往往只能看到昨天的数据, ...

  3. 【论文十问】基于数据库日志的变化数据捕获研究

    文章目录 摘要 十问 Q1 论文试图解决什么问题? Q2 这是否是一个新的问题? Q3 这篇文章要验证一个什么科学假设? Q4 有哪些相关研究?如何归类? Q5 论文中提到的解决方案之关键是什么? Q ...

  4. OpenShift 4 - 使用Debezium实现MySQL的CDC变化数据捕获

    <OpenShift 4.x HOL教程汇总> 说明:本文已经在OpenShift 4.6环境中验证 文章目录 部署应用和MySQL数据库 部署MySQL 部署应用 部署AMQ Strea ...

  5. SQL Server 变更数据捕获(CDC)

    概述 变更数据捕获用于捕获应用到 SQL Server 表中的插入.更新和删除活动,并以易于使用的关系格式提供这些变更的详细信息.变更数据捕获所使用的更改表中包含镜像所跟踪源表列结构的列,同时还包含了 ...

  6. 数据仓库中捕获变化数据(CDC,Changed Data Capture)的四种手法

    a.触发器: 在要抽取的表上建立需要的触发器,一般要建立插入.修改.删除三个触发器,每当源表中的数据发生变化,就被相应的触发器将变化的数据写入一个临时表,抽取线程从临时表中抽取数据,临时表中抽取过的数 ...

  7. 变更数据捕获(CDC)

    从广泛意义上说,全球许多企业每天都需要通过频繁的数据批量处理与加载,来定期将数据从一个数据库迁移到另一个数据库(或数据仓库).这类定期批量加载的工作,往往既耗费时间,又会消耗原始系统的大量处理能力.因 ...

  8. 【论文翻译】在不同数据结构中实现变更数据捕获方法以支持实时数据仓库的实验结果

    文章目录 在不同数据结构中实现变更数据捕获方法以支持实时数据仓库的实验结果 1 引言 2 相关工作 3 方法论 3.1 数据来源 3.2 变更数据捕获方法 4 分析和设计 4.1 环境准备 4.2 变 ...

  9. go 捕获数据库新增数据_更改数据捕获的经验教训

    go 捕获数据库新增数据 The article summarizes experiences from various projects with a log-based change data c ...

最新文章

  1. 近期活动盘点:清华严飞大数据探寻中国文脉讲座、2019前沿信息科技创新论坛...
  2. 带你简单了解通信工程
  3. Eclipse 代码自动提示的设置
  4. Python换行符问题:\r\n还是\n?
  5. 阿里云ECI如何6秒扩容3000容器实例?
  6. 介绍一个十分好用的JQUERY图片放大镜插件
  7. RequireJS使用小结1——for Effective JavaScript Module Loading
  8. OpenInfra Days China 2020 官网正式上线,含免费注册通道!
  9. android 多线程 js,android中的jstack,见见线程都在干嘛
  10. StretchDIBits 函数
  11. 中国传统颜色16进制颜色码
  12. 7500字拆解林清轩:说透了的“数字化转型”还有什么秘密武器?
  13. TITAN RTX 与 RTX 3090 参数的对比,探计单双精度的问题
  14. 在线上也能进行商标注册
  15. 崔毅东 C++程序设计入门(下) 第9单元:白公曾咏牡丹芳,一种鲜妍独“异常” 笔记
  16. 致敬图灵,数说人工智能的前世今生
  17. 记一次成功把Vue2后台项目改造成Vite2的踩坑经历
  18. 区块链如何加快智慧城市建设?
  19. java mathematica_java与mathematica
  20. android studio 读音,simplicity

热门文章

  1. JVM内存模型和性能调优:栈(线程)- 第11篇
  2. 第17章- 5~8 钣金实体书架与刚体平台接触分析、材料弹塑性分析(网格控制、刚体接触设置,刚体只能作为接触的目标面、爆炸显示、载荷步设置、残余应力)
  3. C++: string讲解 前序
  4. 如何实现室内Wi-Fi无线终端的精准定位
  5. github无法加载图片-请看这里
  6. nbsp; quot; amp;lt; gt; 等html字符转义
  7. 安卓背景音乐开关_微信7.0.4内测版怎么申请?微信7.0.4安卓内测版下载安装教程...
  8. sqlserver常用查询语句
  9. Spring Boot-2-核心注解
  10. Linux之yum阿里镜像