删除“table.include.list”不会强制 Debezium 为数据库中的其余表创建主题

Posted

技术标签:

【中文标题】删除“table.include.list”不会强制 Debezium 为数据库中的其余表创建主题【英文标题】:removing "table.include.list" does not force Debezium to create topics for the rest of tables in database 【发布时间】:2021-07-17 09:39:14 【问题描述】:

我创建了 Debezium 连接器,它就像一个魅力:


    "name": "debezium_title",
    "config": 
        "connector.class": "io.debezium.connector.mysql.MySqlConnector",
        "tasks.max": "1",
        "database.hostname": "xxx.xxx.xxx",
        "database.port": "3306",
        "database.user": "kafkaconnect",
        "database.password": "***",
        "database.server.name": "mysql_debezium",
        "heartbeat.interval​.ms": 5000,
        "snapshot.mode": "when_needed",
        "snapshot.new.tables": "parallel",
        "database.include.list": "database",
        "table.include.list": "database.table1,database.table2",
        "database.history.kafka.topic": "mysql_debezium_history",
        "database.history​.kafka.recovery​.poll.interval.ms": 5000,
        "database.history.kafka.bootstrap.servers": "xxx.xxx.xxx:9092",
        "include.schema.changes": "false",
        "transforms": "extractInt",
        "transforms.extractInt.type": "org.apache.kafka.connect.transforms.ExtractField$Key",
        "transforms.extractInt.field": "id"
    

现在,我想删除此连接器并创建一个没有表白名单的新连接器 - 以摄取整个数据库:


    "name": "debezium_title_new",
    "config": 
        "connector.class": "io.debezium.connector.mysql.MySqlConnector",
        "tasks.max": "1",
        "database.hostname": "xxx.xxx.xxx",
        "database.port": "3306",
        "database.user": "kafkaconnect",
        "database.password": "***",
        "database.server.name": "mysql_debezium_new",
        "heartbeat.interval​.ms": 5000,
        "snapshot.mode": "initial",
        "database.include.list": "database",
        "database.history.kafka.topic": "debezium_mysql_history_new",
        "database.history​.kafka.recovery​.poll.interval.ms": 5000,
        "database.history.kafka.bootstrap.servers": "xxx.xxx.xxx:9092"
    

新增:连接器名称、数据库服务器名称和数据库历史 kafka 主题名称。

奇怪的是,它只为我在"table.include.list" 中为第一个连接器设置的表创建了主题!

kafka-topics --list --zookeeper xxx.xxx:2181

mysql_debezium_new.table1
mysql_debezium_new.table2

过了一会儿,错误发生了: Encountered change event for table database.table3 whose schema isn't known to this connector(table3 是数据库中未在第一个连接器中的白名单中的表示例)

我的数据库中的其余表在哪里? :) 当我已经拥有带有表白名单的连接器时,如何强制 Debezium 从 mysql 中移动所有表(删除第一个连接器并创建没有白名单的新连接器无济于事)。

我也尝试将新表添加到白名单,但它也不起作用 - 它不会创建新主题并且不会加载整个表 - 它等待表中的第一条新记录,然后发生错误:不知道此表的架构。

怎么样? Debezium 是否为第一个连接器拍摄数据库快照,然后将其保存在某个地方并保留它?如何重置?

Debezium 版本:1.5

【问题讨论】:

除了使用第一个配置之外,您还进行了其他更改吗?我也试图在本地设置它并在本地 mysql 上有一个 motor.books 表。 "database.server.name": "mysql_debezium_new", "database.history.kafka.topic": "debezium_mysql_history_new", 这些 server.name / kakfa.topic 的值可以是任何值还是必须遵循一些约定? 【参考方案1】:

该参数是可选的,如果您希望它获取所有非系统表完全省略该参数。

来自文档: 一个可选的以逗号分隔的正则表达式列表,匹配您希望 Debezium 捕获的表的完全限定表标识符;任何未包含在 table.include.list 中的表都将从捕获中排除。每个标识符的格式为 schemaName.tableName。默认情况下,连接器会捕获指定模式的所有非系统表。不得与 table.exclude.list 一起使用。

上述 Debezium 文档的链接:https://debezium.io/documentation/reference/connectors/sqlserver.html

【讨论】:

以上是关于删除“table.include.list”不会强制 Debezium 为数据库中的其余表创建主题的主要内容,如果未能解决你的问题,请参考以下文章

Kafka 连接(Debezium mysql 连接器)只监听 table.include.list 中的特定表

table.include.list 配置参数在 Debezium Postgres 连接器中不起作用

带有 column.include.list 的 Debezium 连接器

JVM如何理解强引用软引用弱引用虚引用?

JVM如何理解强引用软引用弱引用虚引用?

UITextField如何删除强密码覆盖