在 Debezium 中无法根据 MySQL 的表创建某些主题

Posted

技术标签:

【中文标题】在 Debezium 中无法根据 MySQL 的表创建某些主题【英文标题】:Some topics are unable to created as per tables of MySQL in Debezium 【发布时间】:2021-12-15 00:20:23 【问题描述】:

我使用 Debezium for CDC 从 mysql 到 Kafka 主题,这里的问题是创建了一些主题,而一些主题没有根据特定数据库中的表列表创建。 我在数据库中有 5 个表,名称是 demo。

table_1、table_2、table_3、table_4 和 table_5。

能够创建 2 个表格,例如:

demo.demo.table_1
demo.demo.table_2

预期的主题应该是:

 demo.demo.table_1
 demo.demo.table_2
 demo.demo.table_3
 demo.demo.table_4
 demo.demo.table_5

根据 Debezium 的文档:

默认行为是 Debezium MySQL 连接器将一张表中所有 INSERT、UPDATE 和 DELETE 操作的事件写入一个 Kafka 主题。 Kafka主题命名约定如下:

serverName.databaseName.tableName

假设fulfillment 是服务器名称,inventory 是数据库名称,并且数据库包含名为orders、customers 和products 的表。 Debezium MySQL 连接器向三个 Kafka 主题发出事件,每个主题对应一个数据库中的表:

fulfillment.inventory.orders
fulfillment.inventory.customers
fulfillment.inventory.products

无法找到问题到底发生在哪里,我应该在哪里检查问题? 任何日志或权限问题。 此用户拥有所有权限。

下面是配置.JSON文件。


  "name": "inventory-connector",  
  "config":   
    "connector.class": "io.debezium.connector.mysql.MySqlConnector",
    "tasks.max": "1",  
    "database.hostname": "localhost",  
    "database.port": "3306",
    "database.user": "agent",
    "database.password": "123",
    "database.server.id": "123",  
    "database.allowPublicKeyRetrieval":"true",
    "database.server.name": "demo",  
    "database.include.list": "demo",  
    "database.history.kafka.bootstrap.servers": "localhost:9092",  
    "database.history.kafka.topic": "schema-changes.demo"  
  

如果有人有任何解决方案,请建议我。

谢谢, 双马尔。

【问题讨论】:

【参考方案1】:

  "name": "inventory-connector",  
  "config":   
    "connector.class": "io.debezium.connector.mysql.MySqlConnector",
    "tasks.max": "1",  
    "database.hostname": "localhost",  
    "database.port": "3306",
    "database.user": "agent",
    "database.password": "123",
    "database.server.id": "123",  
    "database.allowPublicKeyRetrieval":"true",
    "database.server.name": "demo",  
    "database.include.list": "demo",  
    "database.history.kafka.bootstrap.servers": "localhost:9092",  
    "database.history.kafka.topic": "schema-changes.demo",
    "name": "inventory-connector",
    "table.include.list": "table_1, table_2, table_3, table_4, table_5",
    "snapshot.mode": "schema_only"
  

我想你错过了 "table.include.list" debezium 默认 "snapshot.mode"initial,它将从 mysql binlog 中数据的开头获取所有快照。如果 mysql binlog 大小为 1 GB,那么您必须耐心查看结果,kafka broker 仍在处理日志...

我建议你使用"snapshot.mode": "schema_only",它只会对schema进行快照,并且只会记录连接器启动时的数据。

并尝试更新每个表中的数据,主题将自动生成

我希望它有效

问候

【讨论】:

感谢您的回复。在运行这两个命令时面临一个问题,1:“ bin/connect-distributed.sh config/connect-distributed.properties ”和 2:“ curl -i -X POST -H “Accept: application/json” -H “ Content-Type: application/json" localhost:8083/connectors -d @src-srink.json " 第一个命令不起作用,它没有给出任何控制台消息,表示错误或类似信息的简单移动下一行。

以上是关于在 Debezium 中无法根据 MySQL 的表创建某些主题的主要内容,如果未能解决你的问题,请参考以下文章

Debezium 创建新主题时如何编辑复制因子

如何从 Debezium 创建的 avro 消息中获取字段?

由于错误代码 1236,无法启动 debezium MySQL 连接器

无法在 GKE 上部署 mysql debezium 连接器 - 用户没有“锁定表”权限

Debezium 时间戳问题,无法转换为本地时区

Kafka 生产者创建 Debezium MySQL 连接器后无法创建主题并引发连续错误