binglog读取为null的问题

【使用环境】
测试环境

【OB or 其他组件】

  • OceanBase Database 4.3.5(MySQL Mode)
  • OceanBase Binlog Service(与 OceanBase 4.3.5 配套版本)
  • Flink CDC 3.5(仅使用 Source API,底层消费 MySQL Binlog Protocol,不使用 Flink SQL)

【使用版本】

  • OceanBase Database:4.3.5
  • OceanBase Binlog Service:4.3.5 配套版本
  • Flink CDC:3.5

【问题描述】

目前正在评估 OceanBase Binlog Service 与 MySQL Binlog 的兼容性,希望确认 Binlog Service 的实际行为以及官方兼容性文档中的一些描述。

阅读官方兼容性文档后,发现如下说明:

  1. VARCHAR(n > 65535) 不支持。
  2. LOB 类型(TEXT、LONGTEXT、JSON、GIS 等)超过 4KiB 后采用 OUTROW 存储。
  3. 对于采用 OUTROW 存储的 LOB 字段:
  • 更新普通字段时,LOB 字段的 beforeimage/afterimage 会输出 NULL。
  • 删除记录时,LOB 字段 beforeimage 会输出 NULL。
  • OUTROW 更新为 INROW 时,beforeimage 为 NULL。

但是我在实际测试过程中发现,与文档描述并不一致。

例如:

  • TEXT 字段大于 4KiB,可以正常通过 Binlog Service 同步。
  • TEXT 字段已经超过 4KiB(确认属于 OUTROW 场景)时,仅更新其他普通字段(例如 VARCHAR 字段),消费到的 Binlog 中,TEXT 字段并没有输出 NULL,而是仍然能够获取完整内容。

因此希望确认:

  1. 当前 4.3.5 版本是否已经优化了 OUTROW LOB 的输出逻辑,而兼容性文档尚未更新?
  2. 文档中关于 beforeimage/afterimage 输出 NULL 的描述,是否仅适用于某些特殊配置或历史版本?
  3. Binlog Service 是否能够保证 OUTROW LOB 在 UPDATE/DELETE 场景下输出完整的 beforeimage 和 afterimage?
  4. VARCHAR(n > 65535) 不支持,是数据库层限制、Binlog Service 限制,还是 MySQL Binlog 协议兼容性限制?
  5. 是否有 Binlog Service 关于数据类型兼容性的更详细设计文档或源码说明可供参考?

目前主要目标是评估 OceanBase Binlog Service 对 MySQL Binlog 协议的兼容性边界,因此希望能够了解官方推荐的兼容性范围,以及文档与当前版本实际行为之间是否存在差异。

【复现路径】

  1. 创建包含 TEXT 字段的测试表。
  2. 插入一条 TEXT 内容大于 4KiB 的数据。
  3. 启动 Binlog 消费(Flink CDC Source,仅消费 MySQL Binlog 协议)。
  4. 更新同一行中的普通 VARCHAR 字段,不修改 TEXT 字段。
  5. 实际收到的 Binlog 数据中,TEXT 字段仍然为完整内容,并未出现文档描述的 NULL。

【附件及日志】

目前暂无,如需要可以补充建表 SQL、测试 SQL、Binlog 输出内容以及消费到的 SourceRecord 数据。

感谢各位老师解答!

7 个赞

@论坛小助手

感谢您的详细描述,针对您提到的几个问题,我将逐一进行回答。不过,请注意根据现有文档片段并未直接提供所有问题的答案,我会基于OceanBase的知识尝试解答。

1. 当前 4.3.5 版本是否已经优化了 OUTROW LOB 的输出逻辑而兼容性文档尚未更新?

根据您的测试结果,看起来当前版本中 OUTROW 存储的 LOB 字段在仅更新普通字段时,并没有如文档所言输出为 NULL 而是保留了完整内容。这可能意味着实际行为与官方文档有所差异。建议向OceanBase官方支持团队反馈此情况以获取最新的官方解释和文档更新状态。

2. 文档中关于 beforeimage/afterimage 输出 NULL 的描述,是否仅适用于某些特殊配置或历史版本?

依据现有信息无法确定这是否仅为特定配置下或早期版本的行为。如果该特性在新版本中有所改变,则可能是文档滞后于产品更新。再次推荐联系OceanBase的技术支持确认这一变化的有效性和适用范围。

3. Binlog Service 是否能够保证 OUTROW LOB 在 UPDATE/DELETE 场景下输出完整的 beforeimage 和 afterimage?

根据您的测试案例,Binlog Service似乎能够在不修改 OUTROW LOB的情况下,在更新其他列时保持LOB字段值不变。然而,为了确保这一行为的一致性及其限制条件,还是需要通过官方渠道验证。

4. VARCHAR(n > 65535) 不支持,是数据库层限制、Binlog Service 限制,还是 MySQL Binlog 协议兼容性限制?

对于 VARCHAR 长度超过 65535 的情况,这是数据库层面的一个已知限制。即,OceanBase 数据库本身并不支持创建长度超过 65535 的 VARCHAR 类型列。这与 Binlog Service 或 MySQL Binlog 协议无关,而是 OceanBase 数据库设计的一部分。

5. 关于数据类型兼容性的更详细设计文档或源码说明

目前提供的文档片段未能覆盖有关 Binlog Service 内部实现的具体细节,尤其是关于数据类型的处理规则。对于此类高级需求,强烈建议查看OceanBase开源项目下的相关源代码以及参与社区讨论,以获得最准确的信息。

总结

  • 您遇到的实际行为与官方文档可能存在差异,建议联系OceanBase官方技术支持以获取最新信息。
  • 对于超出标准数据类型大小限制的问题,明确是由数据库层强制执行的限制。
  • 如需深入了解Binlog Service内部机制,建议深入研究其源代码并参与社区交流。

希望以上答复对您有所帮助!若还有更多具体技术问题或其他方面的需求,请随时告知。

详情请参考:

  1. 合并
  2. MySQL Connector/C 连接 OceanBase 数据库示例程序
  3. 分区交换
  4. 数据备份相关视图介绍
2 个赞

学到了

感谢回复。这个论坛不就是官方论坛了吗?你的意思是要连系商业技术支持人员?

1、是优化了 通过 ext_info_log + ObCDCLobDataMerger 从 LOB 辅助表回读并拼装完整内容
2、基本不适用默认配置,主要描述早期实现或特定边界场景
3、默认配置下,TEXT 等普通 LOB 在多数场景可以;部分边界场景仍可能为 NULL
4、Binlog Service / MySQL Binlog 协议层;数据库层上限为1MB
5、github有源码库 可以看看
https://github.com/oceanbase/oblogproxy
https://github.com/oceanbase/oceanbase/tree/master/src/logservice/libobcdc

1 个赞

mark下。万一以后用的上呢。

感谢分享

感谢分享