重新选择列
概述
为了提高性能和减少存储开销,数据库可以对某些列使用外部存储。这种存储用于存储大量数据的列,例如 PostgreSQL 的 TOAST(The Oversized-Attribute Storage Technique,超大属性存储技术)、Oracle 的 Large Object(LOB)或 Oracle Exadata 的 Extended String 数据类型。为了减少 I/O 开销并提高查询速度,当表行中的数据发生更改时,数据库只检索包含新值的列,而忽略外部存储的、未更改的列中的数据。因此,外部存储列的值不会记录在数据库日志中,Debezium 随后会在发出事件记录时省略该列。下游消费者如果收到省略了必需值的事件记录,可能会遇到处理错误。
如果数据库事件日志条目中不存在某个外部存储列的值,当 Debezium 为该事件发出记录时,它会用 unavailable.value.placeholder 哨兵值替换缺失的值。这些哨兵值会被插入到适当类型的字段中,例如,字节类型的为字节数组,字符串类型的为字符串,键值映射的为键值映射。
要检索初始查询中不可用的列的数据,您可以应用 Debezium 重选列后处理器(ReselectColumnsPostProcessor)。您可以配置后处理器以从表中重选一列或多列。配置后处理器后,它会监视连接器发出的、包含您指定的重选列名的事件。当检测到具有指定列的事件时,后处理器会重新查询源表以检索指定列的数据,并获取它们的当前状态。
您可以配置后处理器重选以下类型的列:
-
null列。 -
包含
unavailable.value.placeholder哨兵值的列。
您只能将 ReselectColumnsPostProcessor 后处理器与 Debezium 源连接器一起使用。此后处理器不适用于 Debezium JDBC Sink 连接器。 |
无主键表
重选列后处理器会生成一个重选查询,该查询返回要修改的行。默认情况下,为了构造查询的 WHERE 子句,后处理器会使用基于表主键列或表中定义的唯一索引的关系表模型。
对于无主键表,ReselectColumnsPostProcessor 提交的 SELECT 查询可能会返回多行,在这种情况下,Debezium 始终只使用第一行。您无法优先排序返回行的顺序。为了使后处理器能够为无主键表返回一致可用的结果,最好指定一个可以标识唯一行的自定义键。自定义键必须能够根据列的组合唯一标识源表中的记录。
要定义这样一个自定义消息键,请在连接器配置中使用 message.key.columns 属性。定义自定义键后,将 reselect.use.event.key 配置属性设置为 true。设置此选项可使后处理器使用指定的事件键字段作为选择条件,以代替主键列。请务必测试配置,以确保重选查询提供预期的结果。
配置示例
配置后处理器类似于配置 自定义转换器或 单消息转换(SMT)。要启用连接器使用 ReselectColumnsPostProcessor,请将以下条目添加到连接器配置中:
"post.processors" : "reselector", (1)
"reselector.type" : "io.debezium.processors.reselect.ReselectColumnsPostProcessor", (2)
"reselector.reselect.columns.include.list" : "<schema>.<table>:<column>,<schema>.<table>:<column>", (3)
"reselector.reselect.unavailable.values" : "true", (4)
"reselector.reselect.null.values" : "true", (5)
"reselector.reselect.use.event.key" : "false", (6)
"reselector.reselect.error.handling.mode" : "WARN" (7)
| Item | 描述 |
|---|---|
1 |
逗号分隔的后处理器前缀列表。 |
2 |
后处理器的完全限定类类型名称。 |
3 |
逗号分隔的列名列表,使用以下格式指定: |
4 |
启用或禁用重选包含 |
5 |
启用或禁用重选 |
6 |
根据事件的键字段名称启用或禁用重选。 |
7 |
当重选找不到行或发生数据库异常时,记录警告或抛出异常。 |
配置选项
下表列出了您可以为重选列后处理器设置的配置选项。
属性 |
Default (默认值) |
描述 |
无默认值 |
要从源数据库重选的列名列表,用逗号分隔。使用以下格式指定列名:
如果设置了 |
|
无默认值 |
要从重选中排除的源数据库中的列名列表,用逗号分隔。使用以下格式指定列名:
如果设置了 |
|
|
指定后处理器是否重选与 |
|
|
指定后处理器是否重选与 |
|
|
指定后处理器是根据事件的键字段名称进行重选,还是使用关系表的主键列名称。 |
|
|
指定重选后处理器如何对某些条件做出反应。 |