
在上一篇Debezium 实战:几行代码,实现 MySQL CDC 数据采集 文章中,我通过 debezium 实现了本地 MySQL 数据的采集,虽然整个过程看起来很顺利,实则也是遇到了很多问题,今天这篇文章就来列举一下,我在采集过程中遇到的问题和最终解决方案。
下面问题涉及的代码程序、配置请参考上一篇文章。
第一个问题是启动了采集程序程序之后,我在 test 表中 insert 了好几条数据之后,发现控制台居然没有打印最新变更的数据,然后我就查了一些资料,资料说可能是因为用户权限不够,让我执行下面的命令:
GRANT SELECT, RELOAD, SHOW DATABASES, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'root'@'%';
FLUSH PRIVILEGES;然后我执行了 grant 命令赋权命令。

让我意想不到的是,debezium 居然采集到了这个命令的变更,然后我又插入了一条数据,但是还是没有采集到。

然后我又查阅了一下官网文档,发现 table.include.list 的格式为 databaseName.tableName,但是我在设置的时候只写了表名 test,所以没采集到,然后在修改过后,果然采集到了 insert 的变更数据。
修改后的代码如下:
// props.setProperty("database.include.list", "debezium");
props.setProperty("table.include.list", "debezium.test");在解决了上面的问题后,也遗留了一个新的问题,就是我只想采集 DML(INSERT、UPDATE、DELETE)变更数据。后来我看了一下官网,有个字段可以禁用 ddl 变更采集。include.schema.changes 字段默认值是 true,默认采集 ddl、dcl 这些变更,我们需要把它手动设置为 false。
在程序配置中添加一行代码:
props.setProperty("include.schema.changes", "false");然后我在 MySQL 中执行了关于 grant、create table、insert 一系列操作

最后只采集到了 insert 的这个数据变更。

顺便补习了一下关于 SQL 语句中的分类:
在程序启动期间,我在 MySQL 中插入了一些数据,然后 debezium 采集成功并在控制台打印。

然后打印出来我就立马重启了程序,发现上次采集过得数据,又被采集和打印了。

因为之前经常和 Kafka 打交道,这种情况就让我联想到了 Kafka 因为 offset 提交不及时重复消费的问题,然后我就搜到了 offset.flush.interval.ms 这个参数,这个参数翻译过来就是 提交offset的间隔,我们使用的 offset.dat 用作记录 offset,在之前程序中定义了 60000 ms,也就是1分钟提交一次,所以立即重启程序就会导致 offset 未及时提交,所以会重复采集。
我们将这个参数修改为 1000 ms,也就是1s就解决了这个问题。
props.setProperty("offset.flush.interval.ms", "10000");同时 offset.commit.policy 定义了提交策略,默认是 PeriodicCommitOffsetPolicy,可以看到使用 offset.flush.interval.ms 去做提交处理。

本篇文章主要分析了几个在 CDC 程序中采集 MySQL 变更数据是遇到的问题,也不难看出,基本通过配置就能搞定,所以学好 debezium 的关键之处就是搞明白它的这些配置。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。