Kettle - 基于快照的CDC

源数据表student_cdc

建表语句见文章尾部。
快照表student_cdc_snap1
(由源数据表复制得到)

第一次数据同步

student_cdc_sync

2000 Years Later
1 2 3 4
| INSERT INTO student_cdc (姓名,性别,班级,年龄,成绩,身高,手机,插入时间,更新时间) VALUES('赵六','男','1701','16','78','170','123456781234',DATE_SUB(CURDATE(), INTERVAL 1 DAY),DATE_SUB(CURDATE(), INTERVAL 1 DAY)); update student_cdc set 成绩=82 where 学号=1; delete from student_cdc where 学号=2
|
源数据表student_cdc

拍摄第二张快照,如下:
快照表student_cdc_snap2

第二次数据同步
对比两张快照表中数据的变化,将变化同步到student_cdc_sync表中。

合并记录步骤
合并记录顾名思义是对记录进行合并;即对记录进行比较;即根据学号对比记录
新数据源与旧数据源中的记录进行对比,对比结果存放到标志字段中,该标志字名我们定义为flagfield。
当记录一致时,flagfield=identical;
当记录新增时,flagfield=new;
当记录被修改时,flagfield=changed;
当记录被删除时,flagfield=deleted;

数据同步
将变化的数据同步到student_cdc_sync表中。

现在student_cdc_snap1 实际上与 student_cdc_sync 内容一致。我们将快照的记录比较结果合并到student_cdc_sync表中,当flagfield=new插入数据,当flagfield=changed修改数据,当flagfield=deleted时,删除数据。

同步结果

附录
student_cdc
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| DROP TABLE IF EXISTS `student_cdc`; CREATE TABLE `student_cdc` ( `学号` int(255) NOT NULL AUTO_INCREMENT, `姓名` varchar(255) DEFAULT NULL, `性别` varchar(255) DEFAULT NULL, `班级` varchar(255) DEFAULT NULL, `年龄` varchar(255) DEFAULT NULL, `成绩` varchar(255) DEFAULT NULL, `身高` varchar(255) DEFAULT NULL, `手机` varchar(255) DEFAULT NULL, `插入时间` varchar(255) DEFAULT NULL, `更新时间` varchar(255) DEFAULT NULL, PRIMARY KEY (`学号`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
INSERT INTO `student_cdc` VALUES ('1', '张三', '男', '1701', '16', '78', '170', '18946554571', '2022-08-06', '2022-08-06'); INSERT INTO `student_cdc` VALUES ('2', '李四', '男', '1701', '17', '80', '175', '18946554572', '2022-08-06', '2022-08-06'); INSERT INTO `student_cdc` VALUES ('3', '王五', '男', '1702', '18', '95', '169', '18946554573', '2022-08-06', '2022-08-06');
|