后处理器

重新选择列

师成师成· 更新于 2026-09-28· 阅读 12 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

重新选择列

概述

为了提升性能并降低存储开销,数据库可以将某些列存储在外部存储中。这种存储方式适用于存放大量数据的列,例如 PostgreSQL 的 TOAST(超大属性存储技术)、Oracle 大对象(LOB)或 Oracle Exadata 扩展字符串数据类型。为了减少 I/O 开销并提高查询速度,当表中的某一行数据发生变更时,数据库只会检索包含新值的列,而忽略外部存储中未发生变化的列数据。因此,外部存储列的值不会被记录到数据库日志中,Debezium 在发出事件记录时也相应地省略该列。收到省略了所需值的事件记录的下游消费者可能会出现处理错误。

如果某个事件的数据库日志条目中不包含外部存储列的值,Debezium 在为该事件生成记录时,会用 unavailable.value.placeholder 哨兵值来替代缺失的值。这些哨兵值会被插入到类型匹配的字段中,例如,字节数组用于字节类型、字符串用于字符串类型、键值映射用于映射类型。

要检索初始查询中不可用的列的数据,你可以应用 Debezium 重新选择列后置处理器(ReselectColumnsPostProcessor)。你可以配置该后置处理器,使其从表中重新选择一个或多个列。配置后,它会监控连接器发出的事件,查找你指定要重新选择的列名。当检测到包含指定列的事件时,后置处理器会重新查询源表,以获取指定列的数据,并取回它们的当前状态。

你可以配置后置处理器重新选择以下类型的列:

  • null 列。
  • 包含 unavailable.value.placeholder 哨兵值的列。
你只能将 ReselectColumnsPostProcessor 后置处理器与 Debezium 源连接器配合使用。该后置处理器并非为配合 Debezium JDBC 接收连接器工作而设计。

无键表

重新选择列后置处理器会生成一条重新选择查询,返回待修改的行。为了构建查询的 WHERE 子句,默认情况下,该后置处理器会使用基于表的主键列或为表定义的唯一索引的关系表模型。

对于无主键的表,ReselectColumnsPostProcessor 提交的 SELECT 查询可能返回多行,在这种情况下,Debezium 始终只使用第一行。你无法对返回行的顺序进行优先级排序。为了让后处理器能够为无主键的表返回始终可用的结果,最好指定一个能够标识唯一行的自定义键。该自定义键必须能够基于列的组合唯一标识源表中的记录。

要定义这样的自定义消息键,请在连接器配置中使用 message.key.columns 属性。定义自定义键之后,将 reselect.use.event.key 配置属性设置为 true。设置此选项后,后处理器将使用指定的事件键字段作为选择条件,以代替主键列。请务必对该配置进行测试,以确保重新选择查询能提供预期的结果。

配置示例

配置后处理器的方式类似于配置自定义转换器或单消息转换(SMT)。要使连接器使用 ReselectColumnsPostProcessor,请在连接器配置中添加以下条目:

  "post.processors" : "reselector",
  "post.processors.reselector.type" : "io.debezium.processors.reselect.ReselectColumnsPostProcessor",
  "post.processors.reselector.reselect.columns.include.list" : "<schema>.<table>:<column>,<schema>.<table>:<column>",
  "post.processors.reselector.reselect.unavailable.values" : "true",
  "post.processors.reselector.reselect.null.values" : "true",
  "post.processors.reselector.reselect.use.event.key" : "false",
  "post.processors.reselector.reselect.error.handling.mode" : "WARN"

有关可用配置属性的完整列表,请参阅配置选项。

配置选项

下表列出了可以为重选列(Reselect Columns)后处理器设置的配置选项。

表 1. 重选列后处理器的配置选项

属性

默认值

说明

post.processors.reselect.columns.post.processors

无默认值

要用逗号分隔的后处理器列表。后处理器按你列出的顺序运行。

[ `post.processors.reselector.type](/book/reader/debezium/reselect-columns#reselect-columns-post-processor-property-post-processors-reselector-type)

无默认值

指定后处理器的完全限定类名。

post.processors.reselect.columns.include.list

无默认值

要用逗号分隔的列名列表,指定要从源数据库中重新选取的列。如果变更事件中没有指定列的值,后处理器会重新查询源表以获取这些值。请使用以下格式指定列名:

<schema>.<table>:<column>

如果设置了 post.processors.reselect.columns.exclude.list 属性,请勿设置此属性。

post.processors.reselect.columns.exclude.list

无默认值

要用逗号分隔的列名列表,指定源数据库中要排除、不进行重新选取的列。请使用以下格式指定列名:

<schema>.<table>:<column>

如果设置了 post.processors.reselect.columns.include.list 属性,请勿设置此属性。

post.processors.reselect.unavailable.values

true

指定当列值由连接器的 unavailable.value.placeholder 属性提供,且该列匹配 post.processors.reselect.columns.include.list 过滤条件时,后处理器是否重新选取该列。

post.processors.reselect.null.values

true

指定当列值为 null 且该列匹配 post.processors.reselect.columns.include.list 过滤条件时,后处理器是否重新选取该列。

[post.processors.reselect.use.event.key

false

指定后处理器是基于事件的键字段名称重新选择列,还是使用关系表的主键列名称。

默认情况下,重新选择查询基于关系表的主键列或唯一键索引。对于没有主键的表,可将此属性设置为 true,并在连接器配置中配置 message.key.columns 属性,以指定连接器在创建事件时使用的自定义键。随后,后处理器会在 SQL 重新选择查询中将指定的键字段名称作为主键使用。

[post.processors.reselect.error.handling.mode

WARN

指定重新选择后处理器如何应对特定情况。

默认情况下,当找不到该行或发生数据库选择错误时,后处理器会记录一条警告消息。

设置为 FAIL 时,如果在重新选择时该行已不存在,或在重新选择该行时发生数据库故障,连接器将停止处理更改。

评论

登录后参与评论

正在加载评论…