Debezium Java嵌入式连接器:解决MySQL数据变更捕获配置问题

Debezium Java嵌入式连接器:解决MySQL数据变更捕获配置问题

本文旨在解决使用debezium java嵌入式连接器捕获mysql数据变更时遇到的常见配置问题。重点阐述了`database.include.list`与`table.include.list`的正确用法,并指出`whitelist`属性的弃用。通过优化连接器配置,确保debezium能够准确监控并捕获数据库中的增删改事件,从而实现可靠的变更数据捕获。

Debezium Java嵌入式连接器概述

Debezium是一个开源的分布式平台,用于捕获各种数据库的变更数据(Change Data Capture, CDC)。它通过读取数据库的事务日志(如MySQL的binlog)来实时地捕获数据行级别的变更,并将这些变更事件流式传输到Apache Kafka或其他消息队列。Debezium提供了一个Java嵌入式连接器(Embedded Engine),允许开发者在自己的Java应用程序中直接运行Debezium连接器,无需依赖完整的Kafka Connect集群。

在使用Debezium Java嵌入式连接器时,常见的挑战是正确配置连接器以确保它能够准确地监控并捕获所需数据库或表的数据变更。即使连接成功,如果配置不当,Debezium也可能无法触发相应的事件处理逻辑。

核心配置问题分析

当Debezium连接到MySQL数据库并显示连接成功日志(例如Connected to localhost:3305 at binlog.000008/3443),但却未能捕获到数据变更事件时,问题通常出在连接器的配置上。以下是常见的配置误区:

database.include.list与table.include.list的混淆:

立即学习“Java免费学习笔记(深入)”;

database.include.list属性用于指定Debezium应监控的数据库名称列表,其值应为逗号分隔的数据库名(例如db1,db2)。table.include.list属性则用于指定Debezium应监控的表名称列表,其值应为逗号分隔的完全限定表名(例如db1.table1,db2.table2)。在原始配置中,database.include.list被错误地设置为String.join(“,”, mysql.getTables()),这实际上是将表名列表传递给了数据库列表属性,导致Debezium无法正确识别要监控的数据库。

database.whitelist和table.whitelist属性的弃用:

在Debezium的早期版本中,曾使用database.whitelist和table.whitelist来指定包含列表。然而,这些属性在较新的Debezium版本中已被弃用并移除,取而代之的是database.include.list、database.exclude.list、table.include.list和table.exclude.list。原始配置中同时使用了database.whitelist和table.whitelist,并将其值设置为mysql.*。这不仅使用了已弃用的属性,而且其值也可能与database.include.list的意图冲突,进一步导致配置混乱。

正确的配置实践

为了确保Debezium能够正确捕获MySQL的数据变更,我们需要根据其设计意图来配置database.include.list和table.include.list。

假设我们希望监控名为my_application_db数据库中的user表。

示例代码:优化Debezium连接器配置

以下是DebeziumConfigLoader.load方法的优化版本,展示了如何正确配置Debezium MySQL连接器:

Reclaim.ai Reclaim.ai

为优先事项创建完美的时间表

Reclaim.ai 90 查看详情 Reclaim.ai

import io.debezium.config.Configuration;import java.util.Properties;public class DebeziumConfigLoader {    public static Configuration load(Connection connection) {        final MysqlConnection mysql = connection.getMysqlConnection();        // 获取要监控的数据库名称        String databaseToMonitor = mysql.getDbName();         // 获取要监控的表名称列表,例如 "my_application_db.user"        // 假设 mysql.getTables() 返回的是 "user"        String tablesToMonitor = databaseToMonitor + "." + String.join("," , mysql.getTables());        return Configuration.create()                .with("name", "customer-mysql-connector")                .with("connector.class", "io.debezium.connector.mysql.MySqlConnector")                .with("offset.storage", "org.apache.kafka.connect.storage.FileOffsetBackingStore")                .with("offset.flush.interval.ms", "60000")                .with("database.hostname", mysql.getHost())                .with("database.port", mysql.getPort())                .with("database.user", mysql.getUsername())                .with("database.password", mysql.getPassword())                // 正确配置:指定要监控的数据库名称                .with("database.include.list", databaseToMonitor)                 // 正确配置:指定要监控的完全限定表名称                .with("table.include.list", tablesToMonitor)                 .with("include.schema.changes", "false")                .with("database.server.id", "10181") // 确保此ID在所有Debezium连接器实例中唯一                .with("database.server.name", "customer-mysql-db-server")                .with("database.history", "io.debezium.relational.history.FileDatabaseHistory")                .with("database.history.file.filename", "/tmp/dbhistory.dat")                .with("offset.storage.file.filename", "/tmp/offsets.dat")                // 移除已弃用的 'database.whitelist' 和 'table.whitelist'                // .with("database.whitelist", "mysql.*") // 此行应被移除                // .with("table.whitelist", "mysql.*")    // 此行应被移除                .build();    }}

关键修改点:

database.include.list: 现在只包含实际的数据库名称(例如my_application_db)。table.include.list: 现在包含完全限定的表名(例如my_application_db.user)。如果mysql.getTables()返回的是不带数据库名的表名,需要手动拼接。移除database.whitelist和table.whitelist: 避免使用已弃用的属性,并消除潜在的配置冲突。

注意事项与最佳实践

Debezium版本兼容性: 始终查阅您所使用的Debezium版本的官方文档,以了解最新的配置属性和任何弃用信息。属性名称和行为可能在不同版本之间发生变化。

MySQL用户权限: 确保Debezium连接的MySQL用户拥有足够的权限来读取binlog和访问被监控的数据库和表。通常需要REPLICATION SLAVE和SELECT权限。

MySQL Binlog配置:

MySQL的log_bin必须开启。binlog_format应设置为ROW,这是Debezium捕获详细变更所必需的。server_id在MySQL服务器配置中必须是唯一的,并且Debezium连接器配置中的database.server.id也必须是唯一的,且与MySQL服务器的server_id不同。

database.server.id的唯一性: database.server.id用于Debezium标识自身在MySQL复制协议中的从属ID。如果运行多个Debezium连接器实例(即使是不同的应用程序),每个实例都必须配置一个唯一的database.server.id,以避免与MySQL复制协议中的其他从库或Debezium实例冲突。

偏移量存储 (offset.storage) 和数据库历史 (database.history):

offset.storage用于持久化Debezium已处理的binlog位置。当应用程序重启时,Debezium可以从上次中断的地方继续捕获事件,避免数据丢失或重复。在嵌入式模式下,FileOffsetBackingStore是一个简单的选择,但生产环境可能考虑使用更健壮的存储,如数据库。database.history用于存储数据库模式(schema)变更的历史。这对于Debezium正确解析变更事件至关重要。FileDatabaseHistory同样适用于简单场景,但生产环境可能需要考虑Kafka或其他持久化存储。确保offset.storage.file.filename和database.history.file.filename指向的路径是可写且持久化的,以防止应用程序重启后丢失状态。

总结

Debezium Java嵌入式连接器为应用程序集成CDC功能提供了强大而灵活的方式。然而,其有效性高度依赖于准确的配置。通过理解database.include.list和table.include.list的正确用法,避免使用已弃用的属性,并关注MySQL的binlog配置和Debezium的持久化机制,开发者可以确保Debezium能够可靠地捕获数据库变更事件,从而构建出响应式和数据驱动的应用程序。在遇到事件未捕获问题时,仔细检查这些配置项是解决问题的关键。

以上就是Debezium Java嵌入式连接器:解决MySQL数据变更捕获配置问题的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1061763.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月2日 05:32:54
下一篇 2025年12月2日 05:33:14

相关推荐

  • 如何使用 Ant Design 实现自定义的 UI 设计?

    如何使用 Ant Design 呈现特定的 UI 设计? 一位开发者提出: 我希望使用 Ant Design 实现如下图所示的 UI。作为一个前端新手,我不知从何下手。我尝试使用 a-statistic,但没有任何效果。 为此,提出了一种解决方案: 可以使用一个图表库,例如 echarts.apac…

    2025年12月24日
    000
  • Antdv 如何实现类似 Echarts 图表的效果?

    如何使用 antdv 实现图示效果? 一位前端新手咨询如何使用 antdv 实现如图所示的图示: antdv 怎么实现如图所示?前端小白不知道怎么下手,尝试用了 a-statistic,但没有任何东西出来,也不知道为什么。 针对此问题,回答者提供了解决方案: 可以使用图表库 echarts 实现类似…

    2025年12月24日
    300
  • 如何使用 antdv 创建图表?

    使用 antdv 绘制如所示图表的解决方案 一位初学前端开发的开发者遇到了困难,试图使用 antdv 创建一个特定图表,却遇到了障碍。 问题: 如何使用 antdv 实现如图所示的图表?尝试了 a-statistic 组件,但没有任何效果。 解答: 虽然 a-statistic 组件不能用于创建此类…

    2025年12月24日
    200
  • 如何在 Ant Design Vue 中使用 ECharts 创建一个类似于给定图像的圆形图表?

    如何在 ant design vue 中实现圆形图表? 问题中想要实现类似于给定图像的圆形图表。这位新手尝试了 a-statistic 组件但没有任何效果。 为了实现这样的图表,可以使用 [apache echarts](https://echarts.apache.org/) 库或其他第三方图表库…

    好文分享 2025年12月24日
    100
  • echarts地图中点击图例后颜色变化的原因和修改方法是什么?

    图例颜色变化解析:echarts地图的可视化配置 在使用echarts地图时,点击图例会触发地图颜色的改变。然而,选项中并没有明确的配置项来指定此颜色。那么,这个颜色是如何产生的,又如何对其进行修改呢? 颜色来源:可视化映射 echarts中有一个名为可视化映射(visualmap)的对象,它负责将…

    2025年12月24日
    000
  • 网络进化!

    Web 应用程序从静态网站到动态网页的演变是由对更具交互性、用户友好性和功能丰富的 Web 体验的需求推动的。以下是这种范式转变的概述: 1. 静态网站(1990 年代) 定义:静态网站由用 HTML 编写的固定内容组成。每个页面都是预先构建并存储在服务器上,并且向每个用户传递相同的内容。技术:HT…

    2025年12月24日
    000
  • 为什么多年的经验让我选择全栈而不是平均栈

    在全栈和平均栈开发方面工作了 6 年多,我可以告诉您,虽然这两种方法都是流行且有效的方法,但它们满足不同的需求,并且有自己的优点和缺点。这两个堆栈都可以帮助您创建 Web 应用程序,但它们的实现方式却截然不同。如果您在两者之间难以选择,我希望我在两者之间的经验能给您一些有用的见解。 在这篇文章中,我…

    2025年12月24日
    000
  • css网页设计模板怎么用

    通过以下步骤使用 CSS 网页设计模板:选择模板并下载到本地计算机。了解模板结构,包括 index.html(内容)和 style.css(样式)。编辑 index.html 中的内容,替换占位符。在 style.css 中自定义样式,修改字体、颜色和布局。添加自定义功能,如 JavaScript …

    2025年12月24日
    000
  • 深度剖析程序设计中必不可少的数据类型分类

    【深入解析基本数据类型:掌握编程中必备的数据分类】 在计算机编程中,数据是最为基础的元素之一。数据类型的选择对于编程语言的使用和程序的设计至关重要。在众多的数据类型中,基本数据类型是最基础、最常用的数据分类之一。通过深入解析基本数据类型,我们能够更好地掌握编程中必备的数据分类。 一、基本数据类型的定…

    2025年12月24日
    000
  • apache不加载css文件怎么办

    apache不加载css文件的解决办法:1、删除中文字符,使用unicode代替;2、将css文件另存为utf-8格式;3、检查css路径,打开浏览器看是否报404错误;4、使用chmod 777 css文件,给文件添加读取权限。 本教程操作环境:Windows7系统、HTML5&&…

    2025年12月24日
    000
  • CSS如何实现任意角度的扇形(代码示例)

    本篇文章给大家带来的内容是关于CSS如何实现任意角度的扇形(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 扇形制作原理,底部一个纯色原形,里面2个相同颜色的半圆,可以是白色,内部半圆按一定角度变化,就可以产生出扇形效果 扇形绘制 .shanxing{ position:…

    2025年12月24日
    000
  • CSS的Word中的列表详解

    在word中,列表也是使用频率非常高的元素。在css中,列表和列表项都是块级元素。也就是说,一个列表会形成一个块框,其中的每个列表项也会形成一个独立的块框。所以,盒模型中块框的所有属性,都适用于列表和列表项。 除此之外,列表还有 3 个特有的属性 list-style-type、list-style…

    2025年12月24日
    000
  • jimdo能否添加html5弹窗_jimdo弹窗html5代码实现与触发条件【技巧】

    可在Jimdo实现HTML5弹窗的四种方法:一、用内置“弹窗链接”模块;二、通过HTML区块注入精简dialog结构(需配合内联CSS);三、外部托管HTML+iframe嵌入;四、纯CSS :target伪类无JS方案。 如果您希望在Jimdo网站中实现HTML5弹窗效果,但发现平台默认不支持直接…

    2025年12月23日
    000
  • 响应式HTML5按钮适配不同屏幕方法【方法】

    实现响应式HTML5按钮需五种方法:一、CSS媒体查询按max-width断点调整样式;二、用rem/vw等相对单位替代px;三、Flexbox控制容器与按钮伸缩;四、CSS变量配合requestAnimationFrame优化的JS动态适配;五、Tailwind等框架的响应式工具类。 如果您希望H…

    2025年12月23日
    000
  • jimdo如何添加html5表单_jimdo表单html5代码嵌入与字段设置【实操】

    可通过嵌入HTML5表单代码、启用字段验证属性、添加CSS样式反馈及替换提交按钮并绑定JS事件四种方式在Jimdo实现自定义表单行为。 如果您在 Jimdo 网站中需要自定义表单行为或字段逻辑,而内置表单编辑器无法满足需求,则可通过嵌入 HTML5 表单代码实现更灵活的控制。以下是具体操作步骤: 一…

    2025年12月23日
    000
  • vs里面怎么html5_VS新建项目选HTML5模板或文件选HTML5创建【创建】

    Visual Studio 中创建 HTML5 项目可通过四种方式:一、新建空 ASP.NET Web 应用程序后添加 HTML 页面;二、使用 UWP 的 Blank App 模板;三、直接新建 HTML 文件并手动编写标准 HTML5 结构;四、安装 Web Template Studio 扩展…

    2025年12月23日
    000
  • html5能否禁用搜索框自动填充_html5autocomplete关闭方法【教程】

    禁用HTML5搜索框自动填充有五种方法:一、设autocomplete=”off”;二、随机化name/id值;三、用无效autocomplete值如”nope”;四、JS动态设置autocomplete;五、设autocomplete=”…

    2025年12月23日
    000
  • 如何查看编写的html_查看自己编写的HTML文件效果【效果】

    要查看HTML文件的浏览器渲染效果,需确保文件以.html为扩展名保存、用浏览器直接打开、利用开发者工具调试、必要时启用本地HTTP服务器、或使用编辑器实时预览插件。 如果您编写了HTML代码,但无法直观看到其在浏览器中的实际渲染效果,则可能是由于文件未正确保存、未使用浏览器打开或文件扩展名设置错误…

    2025年12月23日
    400
  • html5怎么加php_html5用Ajax与PHP后端交互实现数据传递【交互】

    HTML5不能直接运行PHP,需通过Ajax与PHP通信:前端用fetch发送请求,PHP接收处理并返回JSON,前端解析响应更新DOM;注意跨域、编码、CSRF防护和输入过滤。 HTML5 本身是前端标记语言,不能直接运行 PHP 代码,但可以通过 Ajax(异步 JavaScript)与 PHP…

    2025年12月23日
    300
  • html5怎么设置单选_html5用input type=”radio”加name设单选按钮组【设置】

    HTML5 使用 type=”radio” 实现单选功能,需统一 name 值构成互斥组;通过 checked 设默认项;可用 CSS 隐藏原生控件并自定义样式;推荐用 fieldset/legend 增强语义;required 可实现必填验证。 如果您希望在网页中创建一组互…

    2025年12月23日
    200

发表回复

登录后才能评论
关注微信