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实战应用详细总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/594579.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视频监控可视化云平台EasyCVR智能视频技术优势分析

TSINGSEE青犀视频安防视频管理系统EasyCVR视频智能融合共享平台,是一个支持Windows/Linux(CentOS ubuntu)/国产化系统的视频管理平台。平台可以支持多协议接入,通过视频应用引擎将多种格式的视频数据转换为统一的视频流数据,支持无插件H5直播…

RK3568平台 input输入子系统

一.input子系统简介 Input 子系统是管理输入的子系统, 和 pinctrl 和 gpio 子系统一样, 都是 Linux 内核针对某一类设备而创建的框架。 input 子系统处理输入事务, 任何输入设备的驱动程序都可以通过 input 输入子系统提供的接口注册到内核&…

Java虚拟机介绍

JVM是一种用于计算设备的规范,它是一个虚拟出来的计算机,是通过在实际的计算机上仿真模拟计算机的各个功能来实现的。Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。每个Java虚拟机都着一个清晰的任务&#x…

用通俗易懂的方式讲解大模型:在 CPU 服务器上部署 ChatGLM3-6B 模型

大语言模型(LLM)的量化技术可以大大降低 LLM 部署所需的计算资源,模型量化后可以将 LLM 的显存使用量降低数倍,甚至可以将 LLM 转换为完全无需显存的模型,这对于 LLM 的推广使用来说是非常有吸引力的。 本文将介绍如何…

Flume基础知识(三):Flume 实战监控端口数据官方案例

1. 监控端口数据官方案例 1)案例需求: 使用 Flume 监听一个端口,收集该端口数据,并打印到控制台。 2)需求分析: 3)实现步骤: (1)安装 netcat 工具 sudo yum …

SVN服务端的下载、安装

地址 : Apache Subversion Binary Packages 下载 点击 VisualSVN 安装 都是点击 next 点击next ,即可安装成功

SpringBoot学习(三)-员工管理系统开发(重在理解)

注:此为笔者学习狂神说SpringBoot的笔记,其中包含个人的笔记和理解,仅做学习笔记之用,更多详细资讯请出门左拐B站:狂神说!!! 本文是基于狂神老师SpringBoot教程中的员工管理系统从0到1的实践和理解。该系统应用SpringB…

B端产品经理学习-需求挖掘

B端产品需求挖掘 目录 识别和管理干系人 决策人和负责人需求挖掘 针对用户进行需求挖掘 用户访谈结果整理 B端产品的需求来源是非常复杂的,要考虑多个方面;如果你是一个通用性的产品,要考虑市场、自身优劣势、干系人。而定制型B端产品会…

uniapp:签字版、绘画板 插件l-signature

官方网站:LimeUi - 多端uniapp组件库 使用步骤: 1、首先从插件市场将代码下载到项目 海报画板 - DCloud 插件市场 2、下载后,在项目中的uni_modules目录 3、最后 没有其它步骤,直接官网代码复制到vue文件中就可以了&#xff0c…

综合跨平台全端ui自动化测试框架Airtest——AirtestIDE录制微信小程序脚本教学

前言 有在自动化测试领域的小伙伴应该都知道,app和小程序自动化这一类的自动化测试在实际操作中有时候很棘手让人心烦,动不动就是用appium写代码脚本维护什么的,不仅步骤繁琐,环境配置方面也是繁琐无比,动不动就与客户…

mysql在left join后的where条件里过滤join表将变为inner join

sql1:此时是正常的左连接 select user.name,dept.dept_name from user left join dept on dept.id user.dept_id and dept.is_deletedN where user.is_deleteN此时将返回全部user并附带所属的单位(有可能有些user没有dept) 那假如想查出单位…

策略模式+责任链模式配合Nacos实现参数校验链

1、业务场景 在SpringBoot项目中,针对接收的参数信息,根据需求要进行以下校验: 校验客户的apikey是否合法;校验请求的ip地址是否是白名单;校验短信的签名;校验短信的模板;校验手机号的格式合法…

[足式机器人]Part2 Dr. CAN学习笔记-动态系统建模与分析 Ch02-1+2课程介绍+电路系统建模、基尔霍夫定律

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-动态系统建模与分析 Ch02-12课程介绍电路系统建模、基尔霍夫定律 1. 课程介绍2. 电路系统建模、基尔霍夫定律 1. 课程介绍 2. 电路系统建模、基尔霍夫定律 基本元件: 电量 库伦&…

多模态——旷视大模型Vary更细粒度的视觉感知实现文档级OCR或图表理解

概述 现代大型视觉语言模型(LVLMs),例如CLIP,使用一个共同的视觉词汇,以适应多样的视觉任务。然而,在处理一些需要更精细和密集视觉感知的特殊任务时,例如文档级OCR或图表理解,尤其…

前缀和算法 -- 寻找数组的中心坐标

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 本题链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 输入描述 给定一个数组&#xff0c;接口为int pivotIndex(vector<int>& nums) 输出描述 我们以示例1为例画图解释&#xf…

十二、Seata的⾼可⽤

目录 11.1. mysql存储数据11.2 整合注册中心1、为什么要整合注册中心 &#xff1f;2、windows版seata整合nacos 11.1. mysql存储数据 11.2 整合注册中心 1、为什么要整合注册中心 &#xff1f; 现在我们只有⼀个seata 客户端配置seata.service.grouplist.default127.0.0.1:8…

DRF从入门到精通七(djangorestframework-simplejwt、定制返回格式、多方式登录)

文章目录 一、djangorestframework-simplejwt快速使用1.基础使用步骤2.自己配置视图校验访问局部配置认证及权限类全局配置认证及权限类 3.关于双token认证问题 二、定制返回格式三、多方式登录 一、djangorestframework-simplejwt快速使用 JWT主要用于签发登录接口需要配合认证…

频谱论文:约束飞行轨迹下基于生成对抗网络的三维无线电地图重构

#频谱# T. Hu, Y. Huang, J. Chen, Q. Wu and Z. Gong, "3D Radio Map Reconstruction Based on Generative Adversarial Networks Under Constrained Aircraft Trajectories," in IEEE Transactions on Vehicular Technology, vol. 72, no. 6, pp. 8250-8255, June …

css样式中设置height: calc(100vh-50px)不生效

在CSS中&#xff0c;100vh 表示视口&#xff08;viewport&#xff09;的高度。视口是指浏览器窗口中可见内容的区域&#xff0c;即用户能够看到的网页部分。 100vh 表示视口高度的百分比&#xff0c;具体数值取决于当前浏览器窗口的高度。例如&#xff0c;如果浏览器窗口的高度…

Vue - 多行文本“展开、收起”功能

TextClamp 使用 js 实现文本展开、收起&#xff0c;并非纯 CSS 实现。 Props&#xff1a; fontSize&#xff1a;Number&#xff0c;默认&#xff1a;14lines&#xff1a;Number&#xff0c;默认&#xff1a;1lineHeight&#xff1a;Number&#xff0c;默认&#xff1a;20 F…