Kettle - 基于快照的CDC

image-20221015153258072

源数据表student_cdc

image-20221015154111263

建表语句见文章尾部。

快照表student_cdc_snap1

(由源数据表复制得到)

image-20221015154148737

第一次数据同步

image-20221015162355789

student_cdc_sync

image-20221018101528485

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
image-20221015153641046

源数据表student_cdc

image-20221015154327821

拍摄第二张快照,如下:

快照表student_cdc_snap2

image-20221015154420099

第二次数据同步

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

image-20221015171708441

合并记录步骤

合并记录顾名思义是对记录进行合并;即对记录进行比较;即根据学号对比记录

新数据源与旧数据源中的记录进行对比,对比结果存放到标志字段中,该标志字名我们定义为flagfield

  • 当记录一致时,flagfield=identical

  • 当记录新增时,flagfield=new

  • 当记录被修改时,flagfield=changed

  • 当记录被删除时,flagfield=deleted

image-20221015170654723

数据同步

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

image-20221015171843642

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

image-20221015171944722

同步结果

image-20221015181124033

附录

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;

-- ----------------------------
-- Records of student_cdc
-- ----------------------------
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');