当前位置: 首页 > news >正文

Debezium日常分享系列之:Debezium2.5版本之connector for JDBC

Debezium日常分享系列之:Debezium2.5版本之connector for JDBC

  • 一、概述
  • 二、JDBC 连接器的工作原理
  • 三、使用复杂的 Debezium 变更事件
  • 四、至少一次交付
  • 五、多项任务
  • 六、数据和列类型映射
  • 七、主键处理
  • 八、删除模式
  • 九、幂等写入
  • 十、Schema evolution
  • 十一、引用和区分大小写
  • 十二、数据类型映射
  • 十三、部署
  • 十四、Debezium JDBC 连接器配置
  • 十五、Connector属性
  • 十六、经常问的问题
  • 十七、实际应用案例

一、概述

  • 该连接器目前处于孵化状态。
  • Debezium JDBC 连接器是 Kafka Connect 接收器连接器实现,它可以使用来自多个源主题的事件,然后使用 JDBC 驱动程序将这些事件写入关系数据库。该连接器支持多种数据库方言,包括 Db2、MySQL、Oracle、PostgreSQL 和 SQL Server。

二、JDBC 连接器的工作原理

Debezium JDBC 连接器是 Kafka Connect 接收器连接器,因此需要 Kafka Connect 运行时。连接器定期轮询其订阅的 Kafka 主题,使用这些主题中的事件,然后将事件写入配置的关系数据库。连接器通过使用 upsert 语义和基本模式演化来支持幂等写入操作。

Debezium JDBC 连接器提供以下功能:

  • 使用复杂的 Debezium 变更事件
  • 至少一次交付
  • 多项任务
  • 数据和列类型映射
  • 主键处理
  • 删除模式
  • 幂等写入
  • 模式演变
  • 引用和区分大小写

三、使用复杂的 Debezium 变更事件

默认情况下,Debezium 源连接器会生成复杂的、分层的更改事件。当 Debezium 连接器与其他 JDBC 接收器连接器实现一起使用时,可能需要应用 ExtractNewRecordState 单消息转换 (SMT) 来展平更改事件的负载,以便接收器实现可以使用它们。如果运行 Debezium JDBC 接收器连接器,则无需部署 SMT,因为 Debezium 接收器连接器可以直接使用本机 Debezium 更改事件,而无需使用转换。

当 JDBC 接收器连接器使用来自 Debezium 源连接器的复杂更改事件时,它会从原始插入或更新事件的后续部分中提取值。当接收器连接器使用删除事件时,不会查阅事件有效负载的任何部分。

重要的:

Debezium JDBC 接收器连接器并非设计用于读取架构更改主题。如果您的源连接器配置为捕获架构更改,请在 JDBC 连接器配置中设置主题或topics.regex 属性,以便连接器不会使用架构更改主题。

四、至少一次交付

Debezium JDBC 接收器连接器保证从 Kafka 主题消耗的事件至少被处理一次。

五、多项任务

可以跨多个 Kafka Connect 任务运行 Debezium JDBC 接收器连接器。要跨多个任务运行连接器,请将tasks.max 配置属性设置为希望连接器使用的任务数。 Kafka Connect 运行时启动指定数量的任务,并为每个任务运行一个连接器实例。多个任务可以通过并行读取和处理多个源主题的更改来提高性能。

六、数据和列类型映射

为了使 Debezium JDBC 接收器连接器能够将数据类型从入站消息字段正确映射到出站消息字段,连接器需要有关源事件中存在的每个字段的数据类型的信息。该连接器支持跨不同数据库方言的各种列类型映射。为了从事件字段中的类型元数据正确转换目标列类型,连接器应用为源数据库定义的数据类型映射。可以通过在源连接器配置中设置 column.propagate.source.type 或 datatype.propagate.source.type 选项来增强连接器解析列数据类型的方式。当启用这些选项时,Debezium 会包含额外的参数元数据,这有助于 JDBC 接收器连接器更准确地解析目标列的数据类型。

为了让 Debezium JDBC 接收器连接器处理来自 Kafka 主题的事件,Kafka 主题消息键(如果存在)必须是原始数据类型或 Struct。此外,源消息的有效负载必须是一个 Struct,该结构要么具有没有嵌套结构类型的扁平结构,要么具有符合 Debezium 复杂的分层结构的嵌套结构布局。

如果 Kafka 主题中的事件结构不遵守这些规则,则必须实现自定义单消息转换,以将源事件的结构转换为可用的格式。

七、主键处理

默认情况下,Debezium JDBC 接收器连接器不会将源事件中的任何字段转换为事件的主键。不幸的是,缺乏稳定的主键可能会使事件处理复杂化,具体取决于业务需求,或者接收器连接器使用 upsert 语义时。要定义一致的主键,可以将连接器配置为使用下表中描述的主键模式之一:

模式描述
none创建表时未指定主键字段。
kafka主键由以下三列组成:__连接主题,__连接分区,__connect_offset这些列的值源自 Kafka 事件的坐标。
record_key主键由 Kafka 事件的键组成。如果主键是基本类型,请通过设置primary.key.fields属性指定要使用的列的名称。如果主键是结构体类型,则结构体中的字段将映射为主键的列。可以使用primary.key.fields 属性将主键限制为列的子集。
record_value主键由 Kafka 事件的值组成。由于Kafka事件的值始终是一个Struct,因此默认情况下,值中的所有字段都成为主键的列。要使用主键中的字段子集,请设置primary.key.fields 属性以指定要从中派生主键列的值中以逗号分隔的字段列表。
record_header主键由 Kafka 事件的标头组成。Kafka 事件的标头可以包含多个标头,每个标头可以是 Struct 或基元数据类型,连接器将这些标头组成一个 Struct。因此,该结构中的所有字段都成为主键的列。要使用主键中的字段子集,请设置primary.key.fields 属性以指定要从中派生主键列的值中以逗号分隔的字段列表。

重要:

如果将 Primary.key.mode 设置为 kafka 并将 schema.evolution 设置为 basic,某些数据库方言可能会引发异常。当方言将 STRING 数据类型映射到可变长度字符串数据类型(例如 TEXT 或 CLOB),并且该方言不允许主键列具有无限长度时,会发生此异常。要避免此问题,请在您的环境中应用以下设置:

  • 不要将 schema.evolution 设置为 basic。
  • 提前创建数据库表和主键映射。

八、删除模式

当使用 DELETE 或逻辑删除事件时,Debezium JDBC 接收器连接器可以删除目标数据库中的行。默认情况下,JDBC 接收器连接器不启用删除模式。

如果希望连接器删除行,则必须在连接器配置中显式设置delete.enabled=true。要使用此模式,还必须将primary.key.fields设置为none以外的值。上述配置是必要的,因为删除是根据主键映射执行的,所以如果目标表没有主键映射,连接器将无法删除行。

九、幂等写入

Debezium JDBC 接收器连接器可以执行幂等写入,使其能够重复重放相同的记录,并且不会更改最终的数据库状态。

要使连接器能够执行幂等写入,必须显式将连接器的 insert.mode 设置为 upsert。 upsert 操作应用为更新或插入,具体取决于指定的主键是否已存在。

如果主键值已存在,则该操作会更新该行中的值。如果指定的主键值不存在,则插入会添加新行。

每种数据库方言处理幂等写入的方式都不同,因为没有针对 upsert 操作的 SQL 标准。下表显示了 Debezium 支持的数据库方言的 upsert DML 语法:

方言更新语法
Db2MERGE …​
MySQLINSERT …​ ON DUPLICATE KEY UPDATE …​
OracleMERGE …​
PostgreSQLINSERT …​ ON CONFLICT …​ DO UPDATE SET …​
SQL ServerMERGE …​

十、Schema evolution

可以将以下模式演化模式与 Debezium JDBC 接收器连接器结合使用:

模式描述
none连接器不执行任何 DDL 架构演变。
basic连接器自动检测事件负载中但目标表中不存在的字段。连接器更改目标表以添加新字段。

当 schema.evolution 设置为 basic 时,连接器会根据传入事件的结构自动创建或更改目标数据库表。

当第一次从主题接收事件并且目标表尚不存在时,Debezium JDBC 接收器连接器使用事件的键或记录的模式结构来解析表的列结构。如果启用了架构演化,连接器会在将 DML 事件应用到目标表之前准备并执行 CREATE TABLE SQL 语句。

当 Debezium JDBC 连接器从主题接收事件时,如果记录的模式结构与目标表的模式结构不同,连接器将使用事件的键或其模式结构来识别哪些列是新的,并且必须是新的。添加到数据库表中。如果启用了架构演化,连接器会在将 DML 事件应用到目标表之前准备并执行 ALTER TABLE SQL 语句。由于更改列数据类型、删除列和调整主键可能被视为危险操作,因此禁止连接器执行这些操作。

每个字段的架构决定列是 NULL 还是 NOT NULL。该架构还定义了每列的默认值。如果连接器尝试创建具有可为空性设置或不需要的默认值的表,则必须提前手动创建该表,或者在接收器连接器处理事件之前调整关联字段的架构。要调整为空性设置或默认值,可以引入自定义单消息转换,该转换应用管道中的更改,或修改源数据库中定义的列状态。

字段的数据类型是根据一组预定义的映射来解析的。

重要的:

当向目标数据库中已存在的表的事件结构引入新字段时,必须将新字段定义为可选,或者这些字段必须具有在数据库架构中指定的默认值。如果希望从目标表中删除字段,请使用以下选项之一:

  • 手动删除该字段。
  • 删除该列。
  • 为该字段指定默认值。
  • 将字段定义为可为空。

十一、引用和区分大小写

Debezium JDBC 接收器连接器通过构建在目标数据库上执行的 DDL(架构更改)或 DML(数据更改)SQL 语句来使用 Kafka 消息。默认情况下,连接器使用源主题和事件字段的名称作为目标表中的表名称和列名称的基础。构造的 SQL 不会自动用引号分隔标识符以保留原始字符串的大小写。因此,默认情况下,目标数据库中表名或列名的文本大小写完全取决于数据库在未指定大小写时处理名称字符串的方式。

例如,如果目标数据库方言是 Oracle 并且事件的主题是订单,则目标表将创建为 ORDERS,因为当名称不带引号时,Oracle 默认使用大写名称。同样,如果目标数据库方言是 PostgreSQL 并且事件的主题是 ORDERS,则目标表将创建为 order,因为当名称不带引号时 PostgreSQL 默认为小写名称。

要显式保留 Kafka 事件中存在的表名称和字段名称的大小写,请在连接器配置中将 quote.identifiers 属性的值设置为 true。设置此选项后,当传入事件针对名为orders 的主题且目标数据库方言为Oracle 时,连接器将创建一个名为orders 的表,因为构造的SQL 将表的名称定义为“orders”。当连接器创建列名称时,启用引号会导致相同的行为。

十二、数据类型映射

Debezium JDBC 接收器连接器通过使用逻辑或原始类型映射系统来解析列的数据类型。基本类型包括整数、浮点数、布尔值、字符串和字节等值。通常,这些类型仅用特定的 Kafka Connect 架构类型代码表示。逻辑数据类型通常是复杂类型,包括具有一组固定字段名称和架构的基于结构的类型等值,或用特定编码表示的值,例如自纪元以来的天数。

以下示例显示了原始数据类型和逻辑数据类型的代表性结构:

原始字段模式

{"schema": {"type": "INT64"}
}

逻辑字段模式

["schema": {"type": "INT64","name": "org.apache.kafka.connect.data.Date"}
]

Kafka Connect 并不是这些复杂逻辑类型的唯一来源。事实上,Debezium 源连接器生成的更改事件具有类似逻辑类型的字段来表示各种不同的数据类型,包括但不限于时间戳、日期甚至 JSON 数据。

Debezium JDBC 接收器连接器使用这些基元和逻辑类型将列的类型解析为 JDBC SQL 代码,该代码表示​​列的类型。然后,底层 Hibernate 持久性框架使用这些 JDBC SQL 代码将列的类型解析为所使用方言的逻辑数据类型。下表说明了 Kafka Connect 和 JDBC SQL 类型之间以及 Debezium 和 JDBC SQL 类型之间的原始映射和逻辑映射。实际的最终列类型因每种数据库类型而异。

  • Kafka Connect 原语与列数据类型之间的映射
  • Kafka Connect逻辑类型与列数据类型的映射关系
  • Debezium 逻辑类型和列数据类型之间的映射
  • Debezium 方言特定的逻辑类型和列数据类型之间的映射

表 1. Kafka Connect 原语和列数据类型之间的映射

原始类型JDBC SQL类型
INT8Types.TINYINT
INT16Types.SMALLINT
INT32Types.INTEGER
INT64Types.BIGINT
FLOAT32Types.FLOAT
FLOAT64Types.DOUBLE
BOOLEANTypes.BOOLEAN
STRINGTypes.CHAR, Types.NCHAR, Types.VARCHAR, Types.NVARCHAR
BYTESTypes.VARBINARY

表 2. Kafka Connect 逻辑类型和列数据类型之间的映射

逻辑类型JDBC SQL类型
org.apache.kafka.connect.data.DecimalTypes.DECIMAL
org.apache.kafka.connect.data.DateTypes.DATE
org.apache.kafka.connect.data.TimeTypes.TIMESTAMP
org.apache.kafka.connect.data.TimestampTypes.TIMESTAMP

表 3. Debezium 逻辑类型和列数据类型之间的映射

逻辑类型JDBC SQL类型
io.debezium.time.DateTypes.DATE
io.debezium.time.TimeTypes.TIMESTAMP
io.debezium.time.MicroTimeTypes.TIMESTAMP
io.debezium.time.NanoTimeTypes.TIMESTAMP
io.debezium.time.ZonedTimeTypes.TIME_WITH_TIMEZONE
io.debezium.time.TimestampTypes.TIMESTAMP
io.debezium.time.MicroTimestampTypes.TIMESTAMP
io.debezium.time.NanoTimestampTypes.TIMESTAMP
io.debezium.time.ZonedTimestampTypes.TIMESTAMP_WITH_TIMEZONE
io.debezium.data.VariableScaleDecimalTypes.DOUBLE

重要:如果数据库不支持带时区的时间或时间戳,则映射将解析为不带时区的等效值。

逻辑类型MySQL SQL类型PostgreSQL SQL类型SQL Server SQL类型
io.debezium.data.Bitsbit(n)bit(n) or bit varyingvarbinary(n)
io.debezium.data.EnumenumTypes.VARCHARn/a
io.debezium.data.Jsonjsonjsonn/a
io.debezium.data.EnumSetsetn/an/a
io.debezium.time.Yearyear(n)n/an/a
io.debezium.time.MicroDurationn/aintervaln/a
io.debezium.data.Ltreen/altreen/a
io.debezium.data.Uuidn/auuidn/a
io.debezium.data.Xmln/axmlxml

除了上面的原语和逻辑映射之外,如果更改事件的源是 Debezium 源连接器,则可以通过启用列或数据类型进一步影响列类型的分辨率及其长度、精度和小数位数传播。要强制传播,必须在源连接器配置中设置以下属性之一:

  • column.propagate.source.type
  • datatype.propagate.source.type

Debezium JDBC 接收器连接器应用具有较高优先级的值。

例如,假设更改事件中包含以下字段架构:

Debezium 更改事件字段架构并启用列或数据类型传播

{"schema": {"type": "INT8","parameters": {"__debezium.source.column.type": "TINYINT","__debezium.source.column.length": "1"}}
}

在前面的示例中,如果未设置架构参数,则 Debezium JDBC 接收器连接器会将此字段映射到 Types.SMALLINT 列类型。 Types.SMALLINT 可以具有不同的逻辑数据库类型,具体取决于数据库方言。对于 MySQL,示例中的列类型转换为没有指定长度的 TINYINT 列类型。如果为源连接器启用了列或数据类型传播,则 Debezium JDBC 接收器连接器将使用映射信息来优化数据类型映射过程并创建类型为 TINYINT(1) 的列。

注意:通常,当源数据库和接收器数据库使用相同类型的数据库时,使用列或数据类型传播的效果要大得多。我们不断寻找改进跨异构数据库映射的方法,当前的类型系统使我们能够根据反馈继续完善这些映射。

十三、部署

安装步骤:

  • 下载 Debezium JDBC 连接器插件
  • 将Debezium JDBC 连接器插件文件提取到Kafka Connect 环境中。
  • (可选)从 Maven Central 下载 JDBC 驱动程序,并将下载的驱动程序文件提取到包含 JDBC 接收器连接器 JAR 文件的目录。注意:JDBC 接收器连接器不包含 Oracle 和 Db2 的驱动程序。必须下载驱动程序并手动安装。
  • 将驱动程序 JAR 文件添加到 JDBC 接收器连接器的安装路径。
  • 确保安装 JDBC 接收器连接器的路径是 Kafka Connect plugin.path 的一部分。
  • 重新启动 Kafka Connect 进程以获取新的 JAR 文件。

安装详细步骤请参考博主下面这篇技术博客:

  • Debezium系列之:安装部署debezium详细步骤,并把debezium服务托管到systemctl

十四、Debezium JDBC 连接器配置

通常,可以通过提交指定连接器配置属性的 JSON 请求来注册 Debezium JDBC 连接器。以下示例显示了用于注册 Debezium JDBC 接收器连接器实例的 JSON 请求,该连接器使用最常见的配置设置使用来自名为 order 的主题的事件:

示例:Debezium JDBC 连接器配置

{"name": "jdbc-connector",  1"config": {"connector.class": "io.debezium.connector.jdbc.JdbcSinkConnector",  2"tasks.max": "1",  3"connection.url": "jdbc:postgresql://localhost/db",  4"connection.username": "pguser",  5"connection.password": "pgpassword",  6"insert.mode": "upsert",  7"delete.enabled": "true",  8"primary.key.mode": "record_key",  9"schema.evolution": "basic",  10"database.time_zone": "UTC",  11"topics": "orders" 12}
}
  • 1.当向 Kafka Connect 服务注册连接器时分配给连接器的名称。
  • 2.JDBC 接收器连接器类的名称。
  • 3.为此连接器创建的最大任务数。
  • 4.连接器用于连接到其写入的接收器数据库的 JDBC URL。
  • 5.用于身份验证的数据库用户的名称。
  • 6.用于身份验证的数据库用户的密码。
  • 7.连接器使用的 insert.mode。
  • 8.允许删除数据库中的记录。
  • 9.指定用于解析主键列的方法。
  • 10.使连接器能够发展目标数据库的架构。
  • 11.指定编写时间字段类型时使用的时区。
  • 12.要使用的主题列表,以逗号分隔。

有关可以为 Debezium JDBC 连接器设置的配置属性的完整列表。

可以使用 POST 命令将此配置发送到正在运行的 Kafka Connect 服务。该服务记录配置并启动执行以下操作的接收器连接器任务:

  • 连接到数据库。
  • 使用订阅的 Kafka 主题中的事件。
  • 将事件写入配置的数据库。

十五、Connector属性

Debezium JDBC 接收器连接器具有多个配置属性,可以使用它们来实现满足您需求的连接器行为。许多属性都有默认值。有关属性的信息组织如下:

  • JCBC 连接器通用属性
  • JDBC 连接器连接属性
  • JDBC 连接器运行时属性
  • JDBC 连接器可扩展属性

表 5. 通用属性

属性默认值描述
nameNo default连接器的唯一名称。如果您在注册连接器时尝试重复使用此名称,则会导致失败。所有 Kafka Connect 连接器都需要此属性。
connector.classNo default连接器的 Java 类的名称。对于 Debezium JDBC 连接器,指定值 io.debezium.connector.jdbc.JdbcSinkConnector。
tasks.max1用于此连接器的最大任务数。
topicsNo default要使用的主题列表,以逗号分隔。请勿将此属性与 topic.regex 属性结合使用。
topics.regexNo default指定要使用的主题的正则表达式。在内部,正则表达式被编译为 java.util.regex.Pattern。请勿将此属性与主题属性结合使用。

表 6. JDBC 连接器连接属性

PropertyDefaultDescription
connection.urlNo default用于连接数据库的 JDBC 连接 URL。
connection.usernameNo default连接器用于连接到数据库的数据库用户帐户的名称。
connection.passwordNo default连接器用于连接数据库的密码。
connection.pool.min_size5指定池中的最小连接数。
connection.pool.max_size32指定池维护的最大并发连接数。
connection.pool.acquire_increment32指定当连接池超过其最大大小时连接器尝试获取的连接数。
connection.pool.timeout1800指定未使用的连接在被丢弃之前保留的秒数。

表 7. JDBC 连接器运行时属性

属性默认值描述
database.time_zoneUTC指定插入 JDBC 临时值时使用的时区。
delete.enabledfalse指定连接器是否处理 DELETE 或逻辑删除事件并从数据库中删除相应的行。使用此选项需要将primary.key.mode 设置为record.key。
truncate.enabledfalse指定连接器是否处理 TRUNCATE 事件并从数据库中截断相应的表。
insert.modeinsert指定用于将事件插入数据库的策略。可以使用以下选项:insert:指定所有事件都应构造基于 INSERT 的 SQL 语句。仅当未使用主键时,或者当您可以确定不会对具有现有主键值的行进行更新时,才使用此选项。update:指定所有事件都应构造基于 UPDATE 的 SQL 语句。仅当您可以确定连接器仅接收适用于现有行的事件时,才使用此选项。upsert:指定连接器使用 upsert 语义将事件添加到表中。也就是说,如果主键不存在,则连接器执行 INSERT 操作,如果主键存在,则连接器执行 UPDATE 操作。当需要幂等写入时,应将连接器配置为使用此选项。
primary.key.modenone指定连接器如何解析事件中的主键列。none:指定不创建主键列。kafka:指定连接器使用 Kafka 坐标作为主键列。键坐标是根据事件的主题名称、分区和偏移量定义的,并映射到具有以下名称的列:__连接主题,__连接分区,__connect_offset,record_key:指定主键列源自事件的记录键。如果记录键是原始类型,则需要使用primary.key.fields属性来指定主键列的名称。如果记录键是结构类型,则primary.key.fields属性是可选的,并且可用于将事件键中的列子集指定为表的主键。record_value:指定主键列源自事件的值。您可以设置primary.key.fields属性来将主键定义为事件值的字段子集;否则默认使用所有字段。
primary.key.fieldsNo default主键列的名称或从中派生主键的逗号分隔字段列表。当primary.key.mode设置为record_key并且事件的键是原始类型时,预计该属性指定用于键的列名。当 Primary.key.mode 设置为具有非原始键的 record_key 或 record_value 时,预计此属性会指定键或值中的以逗号分隔的字段名称列表。如果primary.key.mode设置为具有非原始键的record_key或record_value,并且未指定此属性,则连接器从记录键或记录值的所有字段派生主键,具体取决于指定的模式。
quote.identifiersfalse指定生成的 SQL 语句是否使用引号来分隔表名和列名。
schema.evolutionnone指定连接器如何演变目标表架构。有关更多信息,请参阅架构演变。可以使用以下选项:none:指定连接器不发展目标架构。basic:指定发生基本进化。连接器通过将传入事件的记录架构与数据库表结构进行比较,将缺失的列添加到表中。
table.name.format${topic}指定一个字符串,该字符串根据事件的主题名称确定目标表名称的格式。占位符 ${topic} 将替换为主题名称。
dialect.postgres.postgis.schemapublic指定安装 PostgreSQL PostGIS 扩展的架构名称。默认为public;但是,如果 PostGIS 扩展安装在另一个模式中,则应使用此属性来指定备用模式名称。
dialect.sqlserver.identity.insertfalse指定连接器是否在对 SQL Server 表的标识列执行 INSERT 或 UPSERT 操作之前自动设置 IDENTITY_INSERT,然后在操作后立即取消设置。当默认设置 (false) 生效时,对表的 IDENTITY 列执行 INSERT 或 UPSERT 操作会导致 SQL 异常。
batch.size500指定尝试将多少记录一起批处理到目标表中。请注意,如果您在 Connect Worker 属性中将 Consumer.max.poll.records 设置为低于batch.size的值,则批处理将受到consumer.max.poll.records的限制,并且将无法达到所需的batch.size 。您还可以在连接器配置中使用consumer.override.max.poll.records来配置连接器的底层消费者的max.poll.records。
field.include.listempty string可选的、以逗号分隔的字段名称列表,与要包含在更改事件值中的字段的完全限定名称相匹配。字段的完全限定名称的格式为 fieldName 或 topicName:_fieldName_。如果您在配置中包含此属性,请不要设置 field.exclude.list 属性。
field.exclude.listempty string任选的、以分隔的字段名称列表,与要从更改事件值中删除的字段的完全限定名称相匹配。字段的完全限定名称的格式为 fieldName 或 topicName:_fieldName_。如果您在配置中包含此属性,请不要设置 field.include.list 属性。

表 8. JDBC 连接器可扩展属性

属性默认值描述
column.naming.strategyi.d.c.j.n.DefaultColumnNamingStrategy指定连接器用来解析事件字段名称中的列名称的 ColumnNamingStrategy 实现的完全限定类名称。默认情况下,连接器使用字段名称作为列名称。
table.naming.strategyi.d.c.j.n.DefaultTableNamingStrategy指定 TableNamingStrategy 实现的完全限定类名称,连接器使用该实现来解析传入事件主题名称中的表名称。默认行为是:将 table.name.format 配置属性中的 ${topic} 占位符替换为事件的主题。通过用下划线 (_) 替换点 (.) 来清理表名称。

十六、经常问的问题

是否需要 ExtractNewRecordState 单消息转换?

  • 不,这实际上是 Debezium JDBC 连接器与其他实现的区别因素之一。虽然连接器能够像其竞争对手一样摄取扁平化事件,但它也可以本地摄取 Debezium 的复杂变更事件结构,而不需要任何特定类型的转换。

如果列的类型发生更改,或者列被重命名或删除,这是否由模式演化处理?

  • 不会,Debezium JDBC 连接器不会对现有列进行任何更改。连接器支持的模式演变非常基本。它只是将事件结构中的字段与表的列列表进行比较,然后添加尚未定义为表中的列的任何字段。如果列的类型或默认值发生更改,连接器不会在目标数据库中调整它们。如果重命名列,旧列将保持原样,并且连接器会将具有新名称的列追加到表中;但是,旧列中包含数据的现有行保持不变。这些类型的架构更改应手动处理。

如果列的类型无法解析为我想要的类型,如何强制映射到不同的数据类型?

  • Debezium JDBC 连接器使用复杂的类型系统来解析列的数据类型。有关此类型系统如何将特定字段的架构定义解析为 JDBC 类型的详细信息,请参阅数据和列类型映射部分。如果要应用不同的数据类型映射,请手动定义表以显式获取首选列类型。

如何在不更改Kafka主题名称的情况下为表名称指定前缀或后缀?

  • 要向目标表名称添加前缀或后缀,请调整 table.name.format 连接器配置属性以应用所需的前缀或后缀。例如,要为所有表名称添加 jdbc_ 前缀,请指定 table.name.format 配置属性的值为 jdbc_${topic}。如果连接器订阅了名为orders 的主题,则结果表将创建为jdbc_orders。

即使未启用标识符引用,为什么某些列会自动引用?

  • 在某些情况下,即使未启用 quote.identifiers,也可能会显式引用特定的列或表名称。当列名或表名以特定约定开头或使用特定约定(否则将被视为非法语法)时,这通常是必要的。例如,当primary.key.mode设置为kafka时,某些数据库仅允许列名以下划线开头(如果列名被引用)。引用行为是特定于方言的,并且在不同类型的数据库之间有所不同。

十七、实际应用案例

  • Debezium系列之:基于Debezium JDBC connector消费Topic数据到Mysql数据库

更多Debezium实战应用可以参考博主Debezium专栏:

  • Debezium专栏,Debezium实战应用详细总结

相关文章:

Debezium日常分享系列之:Debezium2.5版本之connector for JDBC

Debezium日常分享系列之:Debezium2.5版本之connector for JDBC 一、概述二、JDBC 连接器的工作原理三、使用复杂的 Debezium 变更事件四、至少一次交付五、多项任务六、数据和列类型映射七、主键处理八、删除模式九、幂等写入十、Schema evolution十一、引用和区分大…...

爬虫网易易盾滑块案例:某乎

声明: 该文章为学习使用,严禁用于商业用途和非法用途,违者后果自负,由此产生的一切后果均与作者无关 一、滑块初步分析 js运行 atob(‘aHR0cHM6Ly93d3cuemhpaHUuY29tL3NpZ25pbg’) 拿到网址,浏览器打开网站&#xff0…...

机器学习笔记 - 偏最小二乘回归 (PLSR)

一、偏最小二乘回归:简介 PLS 方法构成了一个非常大的方法族。虽然回归方法可能是最流行的 PLS 技术,但它绝不是唯一的一种。即使在 PLSR 中,也有多种不同的算法可以获得解决方案。PLS 回归主要由斯堪的纳维亚化学计量学家 Svante Wold 和 Harald Martens 在 20 世纪 80 年代…...

【HTML5】第1章 HTML5入门

学习目标 了解网页基本概念,能够说出网页的构成以及网页相关名词的含义 熟悉Web标准,能够归纳Web标准的构成。 了解浏览器,能够说出各主流浏览器的特点。 了解HTML5技术,能够知道HTML5发展历程、优势以及浏览器对HTML5的支持情…...

dyld: Library not loaded: /usr/lib/swift/libswiftCoreGraphics.dylib

更新Xcode14后低版本iPhone调试报错 dyld: Library not loaded: /usr/lib/swift/libswiftCoreGraphics.dylib Referenced from: /var/containers/Bundle/Application/…/….app/… Reason: image not found 这是缺少libswiftCoreGraphics库 直接导入libswiftCoreGraphics库即…...

React Hooks中useState的介绍,并封装为useSetState函数的使用

useState 允许我们定义状态变量,并确保当这些状态变量的值发生变化时,页面会重新渲染。 useState 返回值 const [state, setState] useState(initialState);useState 返回一个长度为 2 的数组。通常,我们这样定义状态变量: co…...

5 个最适合SEI 网络空投交易等操作的钱包(Bitget Wallet,Coin98等)

大家好!Sei 网络比 SOL 快 5 倍,手续费低,还能防止前台交易。好了,我不会占用大家太多时间,让我们直奔主题吧。 Sei 官方:推特(twitter.com/SeiNetwork) 如上图所示,目前…...

.net8 AOT编绎-跨平台调用C#类库的新方法-函数导出

VB.NET AOT无法编绎DLL,微软的无能,正是你的机会 .net8 AOT编绎-跨平台调用C#类库的新方法-函数导出 1,C#命令行创建工程:dotnet new classlib -o CSharpDllExport 2,编写一个静态方法,并且为它打上UnmanagedCallersO…...

第三十八周周报:文献阅读 +BILSTM+GRU+Seq2seq

目录 摘要 Abstract 文献阅读:耦合时间和非时间序列模型模拟城市洪涝区洪水深度 现有问题 提出方法 创新点 XGBoost和LSTM耦合模型 XGBoost算法 ​编辑 LSTM(长短期记忆网络) 耦合模型 研究实验 数据集 评估指标 研究目的 洪…...

天津最新web前端培训班 如何提升web技能?

随着互联网的迅猛发展,web前端成为了一个热门的职业方向。越来越多的人希望能够通过学习web前端技术来提升自己的就业竞争力。为了满足市场的需求,许多培训机构纷纷推出了web前端培训课程。 什么是WEB前端 web前端就是web给用户展示的东西,…...

Linux下QT生成的(.o)、(.a)、(.so)、(.so.1)、(.so.1.0)、(.so.1.0.0)之间的区别

记录一下遇到的问题:Linux系统下Qt编译第三方动态库会生成多个.so文件,不了解的小伙伴可能很疑惑: (1)Linux 下 QT 生成的(.o)、(.a)和(.so)三个文…...

线性代数 --- 为什么LU分解中L矩阵的行列式一定等于正负1?

以下是关于下三角矩阵L的行列式一定等于-1的一些说明 笔者的一些话(写在最前面): 这是一篇小文,是我写的关于求解矩阵行列式的一篇文章中的一部分。之所以把这一段专门提溜出来,是因为这一段相对于原文是可以完全独立的,也是因为我…...

Redisson 源码解析 - 分布式锁实现过程

一、Redisson 分布式锁源码解析 Redisson是架设在Redis基础上的一个Java驻内存数据网格。在基于NIO的Netty框架上,充分的利用了Redis键值数据库提供的一系列优势,在Java实用工具包中常用接口的基础上,为使用者提供了一系列具有分布式特性的常…...

玩转贝启科技BQ3588C开源鸿蒙系统开发板 —— 开发板详情与规格

本文主要参考: BQ3588C_开发板详情-开源鸿蒙技术交流-Bearkey-开源社区 BQ3588C_开发板规格-开源鸿蒙技术交流-Bearkey-开源社区 厦门贝启科技有限公司-Bearkey-官网 1. 开发板详情 RK3588 核心板是一款由贝启科技自主研发的基于瑞芯微 RK3588 AI 芯片的智能核心…...

Qt pro文件

1. 项目通常结构 2.pri文件 pri文件可定义通用的宏,例如创建一个COMMON.pri文件内容为 COMMON_PATH D:\MyData 然后其它pri或者pro文件如APPTemplate.pro文件中通过添加include(Common.pri) ,QtCreator就会自动在项目结构树里面创建对应的节点 3.变量…...

实验笔记之——服务器链接

最近需要做NeRF相关的开发,需要用到GPU,本博文记录本人配置服务器远程链接的过程,本博文仅供本人学习记录用~ 连上服务器 首先先确保环境是HKU的网络环境(HKU AnyConnect也可)。伙伴已经帮忙创建好用户(第一次登录会提示重新设置密码)。用cmd ssh链接ssh -p 60001 <u…...

微服务-java spi 与 dubbo spi

Java SPI 通过一个案例来看SPI public interface DemoSPI {void echo(); } public class FirstImpl implements DemoSPI{Overridepublic void echo() {System.out.println("first echo");} } public class SecondImpl implements DemoSPI{Overridepublic void ech…...

redis复习笔记03(小滴课堂)

Redis6常见数据结构概览 0代表存在&#xff0c;1代表不存在。 1表示删除成功&#xff0c;0表示失败。 查看类型&#xff0c;默认string类型。 也可以设置set类型。 list类型。 查看key的过期时间&#xff1a; Redis6数据结构之String类型介绍和应用场景 批量设置&#xff1a; …...

【Spring Cloud】关于Nacos配置管理的详解介绍

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Spring Cloud》。&#x1f3af;&#x1f3af; &am…...

基于Java SSM框架实现校园网络维修系统项目【项目源码】

基于java的SSM框架实现校园网络维修系统演示 java简介 Java主要采用CORBA技术和安全模型&#xff0c;可以在互联网应用的数据保护。它还提供了对EJB&#xff08;Enterprise JavaBeans&#xff09;的全面支持&#xff0c;java servlet API&#xff0c;JSP&#xff08;java serve…...

项目框架构建之3:Nuget服务器的搭建

本文是“项目框架构建”系列之3&#xff0c;本文介绍一下Nuget服务器的搭建&#xff0c;这是一项简单的工作&#xff0c;您或许早已会了。 1.打开vs2022创建Asp.net Web应用程序 框架选择.net framework4.8&#xff0c;因为nuget服务器只支持.net framework。 2.选择空项目和保…...

外包干了1个月,技术退步一大半。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入广州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…...

167. 木棒(dfs剪枝,经典题)

167. 木棒 - AcWing题库 乔治拿来一组等长的木棒&#xff0c;将它们随机地砍断&#xff0c;使得每一节木棍的长度都不超过 50 个长度单位。 然后他又想把这些木棍恢复到为裁截前的状态&#xff0c;但忘记了初始时有多少木棒以及木棒的初始长度。 请你设计一个程序&#xff0…...

用HTML的原生语法实现两个div子元素在同一行中排列

代码如下&#xff1a; <div id"level1" style"display: flex;"><div id"level2-1" style"display: inline-block; padding: 10px; border: 1px solid #ccc; margin: 5px;">这是第一个元素。</div><div id"…...

C++进阶--map和set的介绍及使用

map和set的介绍及使用 一、关联式容器与键值对关联式容器键值对pair树形结构的关联式容器 二、set2.1 set的介绍2.2 set的使用2.2.1 set的模板参数列表2.2.2 set的构造2.2.3 set的迭代器2.2.4 set的容量2.2.5 set修改操作2.2.6 set的使用举例 三、multiset3.1 multiset的介绍3.…...

MIML-DA

图3呢&#xff1f;且作者未提供代码...

[ROS2 Foxy]#1.3 安装使用 turtlesim

官网教程: https://docs.ros.org/en/foxy/Tutorials/Turtlesim/Introducing-Turtlesim.html 1.turtlesim安装和使用 turtlesim是一个轻量级的模拟程序,用来学习ROS2 .通过turtlesim来介绍ROS2在一个基础的水平上都要做了那些事,以此让我们了解将来在真的 robot或者模拟器上使用…...

嵌入式培训机构四个月实训课程笔记(完整版)-Linux系统编程第三天-Linux进程(物联技术666)

更多配套资料CSDN地址:点赞+关注,功德无量。更多配套资料,欢迎私信。 物联技术666_嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记-CSDN博客物联技术666擅长嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记,等方面的知识,物联技术666关注机器学习,arm开发,物联网,嵌入式硬件,单片机…...

1-01初识C语言

一、概述 C语言是贝尔实验室的Ken Thompson&#xff08;肯汤普逊&#xff09;、Dennis Ritchie&#xff08;丹尼斯里奇&#xff09;等人开发的UNIX 操作系统的“副产品”&#xff0c;诞生于1970年代初。 Thompson和Ritchie共同创作完成了Unix操作系统&#xff0c;他们都被称为…...

Python字符串

定义字符串 Python中要定义一个字符串&#xff0c;有比较多的一种方式。 示例代码&#xff1a; s "你好&#xff0c;张大鹏" print(s, type(s))s 你好&#xff0c;张大鹏 print(s, type(s))s """你好&#xff0c;张大鹏""" prin…...

如何给网站流量来源做标记通过在网址后边加问号?/百度竞价推广属于什么广告

框架专利的重要性 ---法国汤姆森公司有损扩展无损专利分析 在国内专利申请中&#xff0c;汤姆森许可贸易公司&#xff08;就是那个和fraunfor IIS 等公司共同持有MP3专利的那个法国企业&#xff09;在中国申请了4个与在现在的有损编码器方法&#xff08;标准&#xff0c;系统&a…...

有域名和主机怎么做网站/投放广告的网站

编辑器竟然不能直接粘贴图片&#xff0c;偏偏我又喜欢截图。只好将博文直接做成图片了。 用到的Linux命令如下&#xff0c;以供懒人同学直接复制粘贴 1.下载Redis安装包wget http://download.redis.io/releases/redis-2.8.12.tar.gz 2.解压并重命名tar -zvxf redis-2.8.12.tar.…...

最早做网站的那批人/百度推广计划

Description N个政党要组成一个联合内阁&#xff0c;每个党都有自己的席位数. 现在希望你找出一种方案&#xff0c;你选中的党的席位数要大于总数的一半&#xff0c;并且联合内阁的席位数越多越好. 对于一个联合内阁&#xff0c;如果某个政党退出后&#xff0c;其它党的席位仍大…...

wps做网站/朝阳区搜索优化seosem

百度网盘里包含了2020年CVPR1469篇论文&#xff0c;永久有效&#xff0c;若对您有帮助&#xff0c;别忘记收藏关注哦。谢谢&#xff01; 链接&#xff1a;https://pan.baidu.com/s/1Zr5usjsv62HIXXMQbNSSwg 提取码&#xff1a;cvpr 直接点击此处更方便哦...

备案的网站建设书是什么意思/win10优化大师怎么样

历时13年&#xff0c;小扎前面的人生终于圆满了&#xff01; 美国时间5月25日下午3点&#xff0c;哈佛大学举办了2017届学生的毕业典礼。现场&#xff0c;随着一声“Dr. Mark Zuckerberg”&#xff0c;穿着一身西装革履的扎克伯格走上了演讲台&#xff0c;面对妻子、应届毕业生…...

西安市建设和住房保障局网站/如何优化关键词提升相关度

正如大家在之前公告中所看到的&#xff0c;多个SAP应用程序已获得认证可在 Azure虚拟机中运行&#xff0c;未来还会有更多 SAP应用程序获得认证。对于希望在 Azure中运行 SAP应用程序的客户来说&#xff0c;这是个激动人心的进展&#xff0c;更多详情&#xff0c;请单击此处。在…...