You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 14:05:16