开云体育官方注册网址Debezium为JDBC连接器

这个连接器是目前处于酝酿状态。在未来的版本中,我们可能会改变的确切语义,配置选项,等等,这取决于我们收到的反馈。如果你遇到任何问题,请让我们知道。

概述

Debe开云体育官方注册网址zium JDBC连接器是卡夫卡连接水槽连接器实现可以使用来自多个源的事件主题,然后写这些事件到一个关系数据库中通过使用JDBC驱动程序。开云体育电动老虎机这个连接器支持多种数据库方言,包括Db2、MySQL,甲骨文,PostgreSQL和开云体育电动老虎机SQL Server。

JDBC连接器是如何运作的吗

Debe开云体育官方注册网址zium JDBC连接器是卡夫卡水槽连接器连接,因此要求卡夫卡连接运行时。连接器定期民调卡夫卡主题订阅,消费活动的主题,然后将事件写入关系数据库进行配置。开云体育电动老虎机连接器支持幂等写操作通过使用插入语义和基本模式演化。

支持以下特性:

使用复杂Debezium变化事件开云体育官方注册网址

默认情况下,Debezi开云体育官方注册网址um源连接器生产复杂,层次变化的事件。当Debe开云体育官方注册网址zium连接器水槽与其他使用JDBC连接器实现,您可能需要应用ExtractNewRecordState单个消息转换(SMT)平载荷变化的事件,这样他们可以被实现。如果运行水槽Debezium 开云体育官方注册网址JDBC连接器,它不是必要的部署SMT,因为Debezium水槽连接器可以直接使用本地Debezium改变事件,没有使用一个转换。

当水槽JDBC连接器使用一个复杂的更改事件从Debezium源连接器,它提取的值开云体育官方注册网址部分的原始插入更新事件。删除事件时被水槽连接器,没有咨询事件有效负载的一部分。

至少一次交付

水槽De开云体育官方注册网址bezium JDBC连接器从卡夫卡消耗保证事件主题加工至少一次。

多个任务

您可以运行跨多个卡夫卡水槽Deb开云体育官方注册网址ezium JDBC连接器连接的任务。连接器运行多个任务,设置tasks.max配置属性的任务的数量你想要使用的连接器。卡夫卡连接运行时启动指定数量的任务,并运行一个实例连接器的每个任务。多个任务可以通过阅读提高性能和并行处理来自多个源变化的话题。

和列数据类型映射

让水槽Debezium JD开云体育官方注册网址BC连接器正确地从一个入站消息字段的数据类型映射到出站消息字段,连接器需要的每个字段的数据类型的信息存在于源的事件。连接器支持广泛的列类型映射在不同数据库方言。开云体育电动老虎机正确转换的目标列类型类型元数据在一个事件字段中,连接器适用于数据类型映射定义的源数据库。开云体育电动老虎机你可以提高连接器的方式解决通过设置数据类型的列column.propagate.source.typedatatype.propagate.source.type源连接器配置选项。当你启用这些选项,Debezium包括额外参数元数据,它帮助水开云体育官方注册网址槽JDBC连接器更准确地解决目标列的数据类型。

水槽Debezi开云体育官方注册网址um JDBC连接器处理事件从卡夫卡的话题,卡夫卡主题消息键,当礼物,必须是原始数据类型或结构体。此外,必须是源的负载信息结构体有一个扁平的结构没有嵌套结构体类型,或者一个嵌套结构体布局符合Debezium复杂的层次结构。开云体育官方注册网址

如果事件在卡夫卡的结构主题不遵守这些规则,你必须实现一个自定义单个消息转换源事件的结构转换成一个可用的格式。

主键处理

默认情况下,水槽Debezium开云体育官方注册网址 JDBC连接器不源事件中的任何字段转换成主键的事件。不幸的是,缺乏一个稳定的主键可以复杂事件处理,根据您的业务需求,或者当水槽连接器使用插入语义。定义一个主键一致,您可以配置连接器使用的主键模式中描述如下表:

模式 描述

没有一个

在创建表时没有指定主键字段。

卡夫卡

主键包含以下三个列:

  • __connect_topic

  • __connect_partition

  • __connect_offset

这些列的值是来自卡夫卡事件的坐标。

record_key

主键是由卡夫卡事件的关键。

如果主键是一个原始类型,指定列的名称通过设置使用primary.key.fields财产。如果主键是一个结构体类型,结构被映射的字段主键的列。您可以使用primary.key.fields财产限制的主键列的一个子集。

record_value

卡夫卡的主键是由事件的价值。

因为卡夫卡的价值始终是一个事件结构体默认情况下,所有字段的值成为主键的列。使用主键字段的一个子集,设置primary.key.fields属性来指定一个以逗号分隔的字段的值,你想获得主键列。

一些数据库开云体育电动老虎机方言如果你设置可能会抛出一个异常primary.key.mode卡夫卡并设置schema.evolution基本。此异常发生当一个方言地图字符串数据类型映射到一个可变长度的字符串数据类型等文本CLOB方言,不允许主键列的长度。为了避免这个问题,在您的环境中应用以下设置:

  • 不设置schema.evolution基本

  • 创建数据库表和主键映射开云体育电动老虎机。

删除模式

水槽De开云体育官方注册网址bezium JDBC连接器可以在目标数据库中删除行开云体育电动老虎机删除墓碑上事件被消耗。默认情况下,水槽JDBC连接器不支持删除模式。

如果你想支持删除行,在连接器配置通过设置显式地启用它delete.enabled = true在连接器配置。然而,使用这种模式必须设置primary.key.fields以外的一个值没有一个。前面的配置是必要的,因为删除执行基于主键映射,所以如果一个目标表没有主键映射,连接器无法删除行。

幂等写道

水槽De开云体育官方注册网址bezium JDBC连接器支持幂等写道,允许同一记录反复重播,最后数据库状态保持一致。开云体育电动老虎机为了支持幂等写道,水槽JDBC连接器必须显式地配置了insert.mode设置为插入。一个插入操作和一个应用更新或者一个插入,这取决于指定的主键已经存在。如果主键值已经存在,操作更新值的行。如果指定的主键值不存在,一个插入添加一个新行。

每个数据库开云体育电动老虎机方言处理幂等不同写道,因为没有SQL标准插入操作。下面说明了插入特定于数据库的使用DML语法,支持数据库方言:开云体育电动老虎机

方言 Upsert语法

Db2

合并…

MySQL

插入在重复键更新……

甲骨文

合并…

PostgreSQL

插入……的冲突做更新设置…

SQL Server

合并…

模式演化

水槽De开云体育官方注册网址bezium JDBC连接器支持以下模式演化模式:

模式 描述

没有一个

连接器不执行任何DDL模式演化。

基本

连接器自动检测领域的事件有效负载,但目标表中不存在。连接器改变了目标表添加新字段。

schema.evolution被设置为基本,连接器会自动创建或改变目标数据库表根据传入的事件的结构。开云体育电动老虎机

事件时收到一个主题第一次和目标表不存在,水槽Debezium JDBC连接器使用事件的关键,或记录的模式结构表的结构来解决这一列。开云体育官方注册网址如果启用了模式演化,连接器准备和执行创建表SQL语句之前应用DML事件到目标表。

当Debezium开云体育官方注册网址 JDBC连接器接收到一个事件从一个话题,如果模式记录的结构不同于目标表的模式结构,连接器使用事件的关键或其模式结构来识别哪些列是新的,而且必须被添加到数据库表中。开云体育电动老虎机如果启用了模式演化,连接器准备和执行ALTER TABLESQL语句之前应用DML事件到目标表。因为改变列的数据类型,删除列,调整主键可以被认为是危险的操作,连接器禁止执行这些操作。

确定每个字段列的模式非空。模式还定义了每一列的默认值。如果连接器试图创建一个表nullability设置或不希望一个默认值,您必须手动创建表,提前,或调整相关领域的模式在水槽连接器处理事件。调整nullability设置或默认值,您可以引入一个自定义单独的消息转换,适用于管道的变化,或修改列源数据库中定义的状态。开云体育电动老虎机

一个字段的数据类型是解决基于一组预定义的映射。有关更多信息,请参见数据类型的映射

当你引入新的领域的事件结构在目标数据库中已经存在的表,您必须定义新的字段为可选,或者字段必须有一个默认值中指定的数据库模式。开云体育电动老虎机如果你想要一个字段删除目标表,使用下列选项之一:

  • 手动删除字段。

  • 删除列。

  • 指定一个默认值。

  • 定义字段可以为空。

引用和大小写敏感性

水槽De开云体育官方注册网址bezium JDBC连接器消耗卡夫卡消息通过构造DDL(模式变化)或DML(数据变化)在目标数据库上执行SQL语句。开云体育电动老虎机默认情况下,连接器使用源话题和事件字段的名称为基础目标表中的表和列的名称。构建SQL不会自动划标识符和引用保存原始字符串的情况下。因此,默认情况下,文本的目标数据库中的表名或列名完全取决于数据库如何处理名称字符串时没有指定。开云体育电动老虎机

例如,如果目标数据库方言是甲骨文和事件的主题是开云体育电动老虎机订单,目标表将被创建订单因为甲骨文时默认为大写的名字的名字不是引用。类似地,如果目的地PostgreSQL数据库方言和事件的主题开云体育电动老虎机是订单,目标表将被创建订单因为PostgreSQL时默认为小写的名字的名字不是引用。

通过设置quote.identifiers真正的在连接器配置,您可以显式地设置表和字段的名称保存的情况下,存在于卡夫卡事件。如果传入的事件为主题订单和目标数据库方言是甲骨文,如果启用了引用开云体育电动老虎机——也就是说,如果quote.identifiers被设置为真正的——连接器创建一个表的名称订单,因为构造SQL定义的表的名称“订单”。当启用引用时,创建列名的行为以同样的方式工作。

数据类型的映射

水槽De开云体育官方注册网址bezium JDBC连接器解决一个列的数据类型使用一个逻辑或原始类型映射系统。原始类型包括价值观,如整数、浮点数、布尔值、字符串和字节。通常,这些类型与一个特定的卡夫卡连接表示模式类型的代码。逻辑数据类型更复杂的类型,包括价值观等结构体有一组固定的字段名称的类型和模式,或值,用特定的编码表示,如时代以来的天数。

下面的例子展示代表原始结构和逻辑数据类型:

原始场模式
{"模式":{“类型”:“INT64}}
逻辑领域的模式
["模式":{“类型”:“INT64”、“名称”:“org.apache.kafka.connect.data。日期”}]

卡夫卡这些复杂的连接并不是唯一来源,逻辑类型。事实上,Debez开云体育官方注册网址ium源连接器生成变化事件,与类似的逻辑字段类型来表示各种不同的数据类型,包括但不限于,时间戳,日期,甚至JSON数据。

水槽De开云体育官方注册网址bezium JDBC连接器使用这些原始和逻辑类型来解决一个列的类型为JDBC SQL代码,代表一个列的类型。然后使用这些JDBC SQL代码由底层Hibernate持久性框架解决逻辑数据类型的列的类型使用的方言。下表说明了原始和卡夫卡连接之间的逻辑映射和JDBC SQL类型,和Debezium之间和JDBC SQL类型。开云体育官方注册网址实际的最后一列类型为每个数据库类型随。开云体育电动老虎机

表1。卡夫卡Connect原语之间的映射和列的数据类型
原始类型 JDBC SQL类型

INT8

Types.TINYINT

INT16

Types.SMALLINT

INT32

Types.INTEGER

INT64

Types.BIGINT

FLOAT32

Types.FLOAT

FLOAT64

Types.DOUBLE

布尔

Types.BOOLEAN

字符串

类型。字符,类型。NCHAR,类型。VARCHAR、Types.NVARCHAR

字节

Types.VARBINARY

表2。卡夫卡连接逻辑类型之间的映射和列的数据类型
逻辑类型 JDBC SQL类型

org.apache.kafka.connect.data.Decimal

Types.DECIMAL

org.apache.kafka.connect.data.Date

Types.DATE

org.apache.kafka.connect.data.Time

Types.TIMESTAMP

org.apache.kafka.connect.data.Timestamp

Types.TIMESTAMP

表3。Debezium逻辑类型之间的映射开云体育官方注册网址和列的数据类型
逻辑类型 JDBC SQL类型

io.开云体育官方注册网址debezium.time.Date

Types.DATE

io.开云体育官方注册网址debezium.time.Time

Types.TIMESTAMP

io.开云体育官方注册网址debezium.time.MicroTime

Types.TIMESTAMP

io.开云体育官方注册网址debezium.time.NanoTime

Types.TIMESTAMP

io.开云体育官方注册网址debezium.time.ZonedTime

Types.TIME_WITH_TIMEZONE

io.开云体育官方注册网址debezium.time.Timestamp

Types.TIMESTAMP

io.开云体育官方注册网址debezium.time.MicroTimestamp

Types.TIMESTAMP

io.开云体育官方注册网址debezium.time.NanoTimestamp

Types.TIMESTAMP

io.开云体育官方注册网址debezium.time.ZonedTimestamp

Types.TIMESTAMP_WITH_TIMEZONE

io.开云体育官方注册网址debezium.data.VariableScaleDecimal

Types.DOUBLE

如果数据库不支开云体育电动老虎机持时间或时间戳与时区,解决其等效没有时区的映射。

表4。之间的映射Debezium dia开云体育官方注册网址lect-specific逻辑类型和列数据类型
逻辑类型 MySQL SQL类型 PostgreSQL SQL类型 SQL Server SQL类型

io.开云体育官方注册网址debezium.data.Bits

位(n)

位(n)一些不同的

varbinary (n)

io.开云体育官方注册网址debezium.data.Enum

枚举

Types.VARCHAR

n /一个

io.开云体育官方注册网址debezium.data.Json

json

json

n /一个

io.开云体育官方注册网址debezium.data.EnumSet

n /一个

n /一个

io.开云体育官方注册网址debezium.time.Year

年(n)

n /一个

n /一个

io.开云体育官方注册网址debezium.time.MicroDuration

n /一个

时间间隔

n /一个

io.开云体育官方注册网址debezium.data.Ltree

n /一个

ltree

n /一个

io.开云体育官方注册网址debezium.data.Uuid

n /一个

uuid

n /一个

io.开云体育官方注册网址debezium.data.Xml

n /一个

xml

xml

除了上面的原始和逻辑映射中,如果改变事件的来源是Debezium源连接器,该决议的列类型,随着它的长度,精度和规模,可以进一步受到传播使列或数据类型。开云体育官方注册网址执行传播,以下属性必须设置在源连接器配置:

  • column.propagate.source.type

  • datatype.propagate.source.type

水槽De开云体育官方注册网址bezium JDBC连接器应用价值更高的优先级。

例如,假设以下字段更改事件模式包括:

开云体育官方注册网址Debezium更改事件字段启用了列或数据类型传播的模式
{"模式":{“类型”:“INT8”,“参数”:{“__debezium.source.colum开云体育官方注册网址n。”:“非常小的整数型”、“__debezi开云体育官方注册网址um.source.column。长度”:“1”}}}

在前面的例子中,如果没有模式参数设置、水槽Debezium JDBC连接器将这个字段映射到列类型开云体育官方注册网址Types.SMALLINTTypes.SMALLINT可以有不同的逻辑数据库类型,根据数据库方言。开云体育电动老虎机将转换为一个MySQL的例子非常小的整数列类型没有指定的长度。如果启用了列或数据类型传播源连接器,水槽Debezium JDBC连接器使用映射信息提炼数据类型映射过程和创建一个列的类型开云体育官方注册网址非常小的整数(1)

通常,使用列或数据类型传播的影响是更大当相同类型的数据库用于源和汇的数据库。开云体育电动老虎机我们不断地寻找方法来提高跨异构数据库之间的映射和当前类型系统允许我们在反馈的基础上继续改进这些映射。开云体育电动老虎机如果你发现一个映射可以改进的,请告诉我们。

部署

部署Debezium J开云体育官方注册网址DBC连接器,安装Debezium JDBC连接器存档,配置连接器,并开始通过添加其配置卡夫卡连接连接器。

先决条件
过程
  1. 下载Debezium开云体育官方注册网址JDBC连接器插件存档

  2. 将文件解压缩到卡夫卡连接环境中。

  3. 选择从Maven中央和提取下载JDBC驱动程序下载的驱动程序文件包含JDBC水槽连接器JAR文件的目录。

    Oracle和Db2驱动程序不会自动附带水槽JDBC连接器,必须手动安装。
  4. 添加JDBC驱动程序JAR文件的路径水槽连接器已经安装。

  5. 确保JDBC连接器水槽安装的路径的一部分卡夫卡连接的plugin.path

  6. 重新启动卡夫卡连接过程去接新的JAR文件。

开云体育官方注册网址Debezium JDBC连接器配置

通常,您注册一个Debezium JDBC连接器通过开云体育官方注册网址提交一个JSON请求指定连接器的配置属性。下面的例子显示了JSON请求注册水槽Debezium JDBC连接器的一个实例,从一个主题叫消耗事件开云体育官方注册网址订单最常见的配置设置:

例如:Debezi开云体育官方注册网址um JDBC连接器配置
{" name ": " jdbc连接器”,(1)“配置”:{“连接器。类”:“io.debez开云体育官方注册网址ium.connector.jdbc.JdbcSinkConnector”,(2)”任务。马克斯”:“1”,(3)”连接。url ": " jdbc: postgresql: / / localhost / db”,(4)”连接。用户名”:“pguser”,(5)”连接。密码”:“pgpassword”,(6)“插入。模式”:“插入”,(7)“删除”。启用”:“真正的”,(8)“primary.key。模式”:“record_key”,(9)”模式。进化”:“基本的”,(10)“开云体育电动老虎机数据库。time_zone UTC“:(11)}}
1 分配给连接器的名称与卡夫卡连接服务当你注册它。
2 的名称JDBC连接器类。
3 的最大数量为这个连接器创建任务。
4 连接器使用的JDBC URL连接到水槽写入数据库。开云体育电动老虎机
5 数据库用户的名称用于身份验证。开云体育电动老虎机
6 使用的数据库用户密码进行身份验证。开云体育电动老虎机
7 insert.mode连接器使用。
8 允许删除记录在数据库中。开云体育电动老虎机有关更多信息,请参见delete.enabled配置属性。
9 指定该方法用于解决主键列。有关更多信息,请参见primary.key.mode配置属性。
10 使连接器发展目标数据库的模式。开云体育电动老虎机有关更多信息,请参见schema.evolution配置属性。
11 指定时区时使用的写作时间字段类型。

配置属性的完整列表,您可以设置Debezium JDBC连接器,明白了开云体育官方注册网址JDBC连接器属性

你可以发送这个配置帖子命令来运行卡夫卡连接服务。服务记录配置并启动一个水槽连接器任务(s),执行以下操作:

  • 连接到数据库。开云体育电动老虎机

  • 消耗的事件订阅卡夫卡的话题。

  • 将事件写入配置数据库。开云体育电动老虎机

连接器属性

水槽De开云体育官方注册网址bezium JDBC连接器有几个配置属性,您可以使用它们来实现连接器行为能够满足您的需要。许多属性的默认值。属性信息的组织结构如下:

表5所示。连接属性
财产 默认的 描述

没有默认的

JDBC连接URL用于连接到数据库。开云体育电动老虎机

没有默认的

数据库用户帐户的名称,连接器使用开云体育电动老虎机连接到数据库。

没有默认的

连接器使用的密码连接到数据库。开云体育电动老虎机

5

指定了最小数量的连接池中。

32

指定的最大并发连接数,池维护。

32

指定连接器的连接数,尝试获取如果连接池超过它的最大大小。

1800年

指定的秒数,一个未使用的连接保持之前就会被丢弃。

表6所示。运行时属性
财产 默认的 描述

UTC

插入时指定时区使用JDBC时间值。

指定是否连接器进程删除墓碑上事件和从数据库中删除相应的行。开云体育电动老虎机使用这个选项要求设置primary.key.moderecord.key

插入

指定策略用于事件插入数据库中。开云体育电动老虎机以下选项可用:

插入

指定所有事件应该构建插入的SQL语句。使用这个选项只有当没有使用主键,或当你可以确定的是没有更新可能发生与现有的主键值的行。

更新

指定所有事件应该构建更新的SQL语句。使用这个选项只有当你只能确定连接器接收事件,适用于现有的行。

插入

指定连接器将事件添加到表使用插入语义。也就是说,如果主键不存在,执行一个连接器插入操作,如果键存在,执行一个连接器更新操作。当幂等需要写道,连接器应该配置为使用这个选项。

没有一个

指定如何从事件连接器解决主键列。

没有一个

指定不创建主键列。

卡夫卡

指定连接器使用卡夫卡坐标为主键列。关键坐标定义的主题名称,分区,和偏移量的事件,和被映射到列以下名称:

  • __connect_topic

  • __connect_partition

  • __connect_offset

record_key

指定主键列来自事件的记录键。如果记录键是一个原始类型,primary.key.fields属性是需要指定主键列的名称。关键是一个结构体类型,如果记录primary.key.fields属性是可选的,并且可以用于指定列的一个子集从事件的主要为表的主键。

record_value

指定主键列来自事件的价值。你可以设置primary.key.fields属性定义主键字段的子集从事件的价值;否则默认情况下使用的所有字段。

没有默认的

主键列的名称或一个以逗号分隔的字段来获取主键。

primary.key.mode被设置为record_key和事件的关键是一个原始类型,预计这个属性指定列名用于关键。

primary.key.mode被设置为record_key非键,或record_value,预计这个属性指定一个以逗号分隔的字段名称从键或值。如果primary.key.mode被设置为record_key非键,或record_value,这个属性是不指定连接器主键来自各个领域的记录键或记录的值,根据指定的模式。

指定生成的SQL语句是否使用引号分隔表和列的名称。看到引用和大小写敏感性部分为更多的细节。

没有一个

指定连接器如何发展目标表模式。有关更多信息,请参见模式演化。以下选项可用:

没有一个

指定连接器不发展目标模式。

基本

指定基本的进化发生。连接器将缺失的列添加到表通过比较传入的事件的记录模式的数据库表结构。开云体育电动老虎机

${主题}

指定一个字符串,决定目标表名是格式化的,基于事件的主题名称。占位符,${主题}主题名称所取代。

表7所示。可扩展属性
财产 默认的 描述

i.d.c.j.n.DefaultColumnNamingStrategy

指定的完全限定类名ColumnNamingStrategy实现的连接器使用解决列名事件字段名称。

默认情况下,连接器使用字段名作为列名称。

i.d.c.j.n.DefaultTableNamingStrategy

指定的完全限定类名TableNamingStrategy连接器使用的实现来解决从传入的事件主题名称表名。

默认行为是:

  • 取代${主题}的占位符table.name.format配置属性与事件的主题。

  • 清洁表名代替点()和下划线(_)。

常见问题

ExtractNewRecordState 需要单独的消息转换?

不,这实际上是一个微分Debezium JDBC连接器从其他实现的因素。开云体育官方注册网址当连接器能够摄取平事件像其竞争对手一样,它也可以摄取Debezium本地事件结构复杂的变化,不需要任何特定类型的转换。开云体育官方注册网址

如果一个列的类型是改变,或者重命名或删除列,这是由模式演化?

不,Debezi开云体育官方注册网址um JDBC连接器不进行任何更改现有的列。支持的模式演化连接器非常基本的。它只是比较事件结构中的字段到表的列列表,然后添加任何字段,尚未定义为表中的列。如果列的类型或默认值变化,连接器不调整他们的目标数据库。开云体育电动老虎机如果重命名列,老左列是按原样,和连接器添加一列新名称表;然而现有行老列中的数据保持不变。这些类型的模式变化应该手动处理。

如果一个列的类型不解决我想要的类型,我怎么能执行映射到不同的数据类型吗?

Debe开云体育官方注册网址zium JDBC连接器使用复杂的类型系统来解决一个列的数据类型。细节关于这个类型系统解决一个特定的领域的模式定义JDBC类型,看到和列数据类型映射部分。如果你想申请一个不同的数据类型映射,显式地定义了表手动获取首选列类型。

你如何指定表名前缀或后缀不改变卡夫卡主题名称?

为了添加一个前缀或后缀到目标表名、调整table.name.format连接器配置属性应用前缀或后缀,你想要的。例如,所有表名前缀jdbc_,指定table.name.format配置属性的值jdbc_ ${主题}。如果连接器订阅一个主题订单,结果创建表jdbc_orders

为什么有些列自动引用,尽管标识符引用未启用?

在某些情况下,特定的列或表名可能是显式地引用,即使quote.identifiers不启用。这通常是必要的,当列或表名始于或使用一个特定的约定,否则被视为非法的语法。例如,当primary.key.mode被设置为卡夫卡一开始,一些数开云体育电动老虎机据库只允许列名下划线如果列的名字引用。引用行为是dialect-specific,类型的数据库的不同而不同。开云体育电动老虎机