首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Debezium 踩坑实录:我在MySQL CDC 遇到的3个问题...

Debezium 踩坑实录:我在MySQL CDC 遇到的3个问题...

原创
作者头像
叫我阿柒啊
发布2025-07-17 15:19:44
发布2025-07-17 15:19:44
2260
举报

前言

在上一篇Debezium 实战:几行代码,实现 MySQL CDC 数据采集 文章中,我通过 debezium 实现了本地 MySQL 数据的采集,虽然整个过程看起来很顺利,实则也是遇到了很多问题,今天这篇文章就来列举一下,我在采集过程中遇到的问题和最终解决方案。

下面问题涉及的代码程序、配置请参考上一篇文章。

采集不到变更数据

第一个问题是启动了采集程序程序之后,我在 test 表中 insert 了好几条数据之后,发现控制台居然没有打印最新变更的数据,然后我就查了一些资料,资料说可能是因为用户权限不够,让我执行下面的命令:

代码语言:sql
复制
GRANT SELECT, RELOAD, SHOW DATABASES, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'root'@'%';
FLUSH PRIVILEGES;

然后我执行了 grant 命令赋权命令。

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

然后我又查阅了一下官网文档,发现 table.include.list 的格式为 databaseName.tableName,但是我在设置的时候只写了表名 test,所以没采集到,然后在修改过后,果然采集到了 insert 的变更数据。

修改后的代码如下:

代码语言:java
复制
// props.setProperty("database.include.list", "debezium");
props.setProperty("table.include.list", "debezium.test");

不想采集DDL数据

在解决了上面的问题后,也遗留了一个新的问题,就是我只想采集 DML(INSERT、UPDATE、DELETE)变更数据。后来我看了一下官网,有个字段可以禁用 ddl 变更采集。include.schema.changes 字段默认值是 true,默认采集 ddl、dcl 这些变更,我们需要把它手动设置为 false。

在程序配置中添加一行代码:

代码语言:java
复制
props.setProperty("include.schema.changes", "false");

然后我在 MySQL 中执行了关于 grant、create table、insert 一系列操作

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

顺便补习了一下关于 SQL 语句中的分类:

  1. DDL(Data Definition Language):定义数据库结构,CREATE、ALTER、DROP
  2. DML(Data Manipulation Language):操作数据内容,SELECT、INSERT、UPDATE、DELETE
  3. DCL(Data Control Language):管理权限,GRANT、REVOKE
  4. TCL(Transaction Control Language):控制事务,COMMIT、ROLLBACK、SAVEPOINT

重启程序重复采集

在程序启动期间,我在 MySQL 中插入了一些数据,然后 debezium 采集成功并在控制台打印。

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

因为之前经常和 Kafka 打交道,这种情况就让我联想到了 Kafka 因为 offset 提交不及时重复消费的问题,然后我就搜到了 offset.flush.interval.ms 这个参数,这个参数翻译过来就是 提交offset的间隔,我们使用的 offset.dat 用作记录 offset,在之前程序中定义了 60000 ms,也就是1分钟提交一次,所以立即重启程序就会导致 offset 未及时提交,所以会重复采集。

我们将这个参数修改为 1000 ms,也就是1s就解决了这个问题。

代码语言:java
复制
props.setProperty("offset.flush.interval.ms", "10000");

同时 offset.commit.policy 定义了提交策略,默认是 PeriodicCommitOffsetPolicy,可以看到使用 offset.flush.interval.ms 去做提交处理。

结语

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 采集不到变更数据
  • 不想采集DDL数据
  • 重启程序重复采集
  • 结语
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档