Debezium-Java无法捕获MySQL数据删除变更问题求助
问题排查与解决方案
1. 清理冲突的过滤配置
你的配置里同时混用了已废弃的database.whitelist/table.whitelist和新版的database.include.list,且参数值存在逻辑错误:
database.include.list用于指定要监控的数据库名,而非表名,你当前传入表名列表会导致连接器无法匹配正确的数据库范围。- 新旧过滤参数同时存在会引发配置冲突,建议统一使用新版的
include.list系列参数。
修改后的配置示例:
return Configuration.create() // 保留其他基础配置项... .with("database.include.list", mysql.getDbName()) // 指定目标数据库名 .with("table.include.list", mysql.getDbName() + ".User") // 指定要监控的User表,格式为「数据库名.表名」 // 移除database.whitelist和table.whitelist配置 .build();
2. 验证MySQL Binlog格式
Debezium依赖MySQL的ROW模式二进制日志才能捕获行级删除操作,执行以下SQL检查当前格式:
SHOW VARIABLES LIKE 'binlog_format';
若结果不是ROW,需修改MySQL配置文件(my.cnf/my.ini):
binlog_format = ROW
修改后重启MySQL服务生效。
3. 检查偏移量与历史文件权限
配置中指定的/tmp/offsets.dat和/tmp/dbhistory.dat需要应用进程具备读写权限,权限不足会导致连接器无法记录偏移位置,进而错过变更事件。可手动创建并设置权限:
touch /tmp/offsets.dat /tmp/dbhistory.dat chmod 664 /tmp/offsets.dat /tmp/dbhistory.dat
4. 确认handleEvent方法的事件处理逻辑
确保handleEvent方法正确识别并处理DELETE类型事件,示例实现:
private void handleEvent(ChangeEvent<SourceRecord, SourceRecord> event) { SourceRecord record = event.value(); String opType = ((Struct) record.value()).getString("op"); // Debezium用"D"标识删除操作 if ("D".equals(opType)) { System.out.println("捕获到删除操作: " + record.value()); } }
5. 开启Debezium调试日志
添加日志配置开启DEBUG级别日志,查看连接器初始化过程中是否存在表过滤失败、权限不足等错误,进一步定位问题。
内容的提问来源于stack exchange,提问作者Furkan Ozmen
相关产品推荐
相关产品推荐

