Debezium Mysql 连接器因 IllegalStateException 而失败,历史主题具有无限保留

Posted

技术标签:

【中文标题】Debezium Mysql 连接器因 IllegalStateException 而失败,历史主题具有无限保留【英文标题】:Debezium Mysql Connector Failed with IllegalStateException for history topic with infinite retention 【发布时间】:2020-11-30 17:30:15 【问题描述】:

我们运行了一个 Debezium mysql 连接器,其中历史主题已经无限保留。但奇怪的是,连接器突然失败,出现以下异常

"org.apache.kafka.connect.errors.ConnectException: java.lang.IllegalStateException: 
The database history couldn't be recovered. 
Consider to increase the value for database.history.kafka.recovery.poll.interval.ms

我注意到的另一件事是,由于在被监控的数据库中创建和删除临时表(没有被 debezium 连接器跟踪),有大量消息被插入到历史主题中。这些消息会是连接器无法读取历史主题消息的原因吗?我们考虑为历史主题启用日志压缩,但注意到一些建议不要启用相同的问题。 https://issues.redhat.com/browse/DBZ-239。

删除历史主题并以schema_recovery 模式重新启动连接器可以很好地重新启动连接器,但想知道可以采取哪些措施来避免这些类型的中断。是否有任何选项只允许为被监控的表存储 DDL 消息。

【问题讨论】:

【参考方案1】:

我认为现在有一个选项取决于您使用的 Debezium 版本,database.history.store.only.captured.tables.ddl。

我自己没有尝试过,但我正在寻找类似的东西。该文档说明了以下内容;

一个布尔值,指定连接器是否应记录所有 DDL 语句 true 仅记录那些与 Debezium 正在捕获其更改的表相关的 DDL 语句。设置为 true 时要小心,因为如果您更改捕获其更改的表,则可能需要丢失数据。 安全的默认值为 false。

我猜如果您在连接器中以严格的方式控制您正在监控的表,将其设置为 true 是安全的。

另一方面,为了恢复,您可能想尝试提高“database.history.kafka.recovery.poll.interval.ms”的值(默认为 100 毫秒)。

祝你好运!

【讨论】:

以上是关于Debezium Mysql 连接器因 IllegalStateException 而失败,历史主题具有无限保留的主要内容,如果未能解决你的问题,请参考以下文章

Debezium - MySQL 连接器 - Kinesis - 服务未启动

Debezium - 自定义负载 - MySQL 连接器

如何为 mysql 数据库创建多个 Debezium 连接器

如何将新表添加到 Debezium MySQL 连接器?

尝试运行连接器类“io.debezium.connector.mysql.MySqlConnector”时出错

MySQL 的 Debezium 连接器。缺少数据库历史主题