【使用环境】
测试环境
【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 的实际行为以及官方兼容性文档中的一些描述。
阅读官方兼容性文档后,发现如下说明:
- VARCHAR(n > 65535) 不支持。
- LOB 类型(TEXT、LONGTEXT、JSON、GIS 等)超过 4KiB 后采用 OUTROW 存储。
- 对于采用 OUTROW 存储的 LOB 字段:
- 更新普通字段时,LOB 字段的 beforeimage/afterimage 会输出 NULL。
- 删除记录时,LOB 字段 beforeimage 会输出 NULL。
- OUTROW 更新为 INROW 时,beforeimage 为 NULL。
但是我在实际测试过程中发现,与文档描述并不一致。
例如:
- TEXT 字段大于 4KiB,可以正常通过 Binlog Service 同步。
- TEXT 字段已经超过 4KiB(确认属于 OUTROW 场景)时,仅更新其他普通字段(例如 VARCHAR 字段),消费到的 Binlog 中,TEXT 字段并没有输出 NULL,而是仍然能够获取完整内容。
因此希望确认:
- 当前 4.3.5 版本是否已经优化了 OUTROW LOB 的输出逻辑,而兼容性文档尚未更新?
- 文档中关于 beforeimage/afterimage 输出 NULL 的描述,是否仅适用于某些特殊配置或历史版本?
- Binlog Service 是否能够保证 OUTROW LOB 在 UPDATE/DELETE 场景下输出完整的 beforeimage 和 afterimage?
- VARCHAR(n > 65535) 不支持,是数据库层限制、Binlog Service 限制,还是 MySQL Binlog 协议兼容性限制?
- 是否有 Binlog Service 关于数据类型兼容性的更详细设计文档或源码说明可供参考?
目前主要目标是评估 OceanBase Binlog Service 对 MySQL Binlog 协议的兼容性边界,因此希望能够了解官方推荐的兼容性范围,以及文档与当前版本实际行为之间是否存在差异。
【复现路径】
- 创建包含 TEXT 字段的测试表。
- 插入一条 TEXT 内容大于 4KiB 的数据。
- 启动 Binlog 消费(Flink CDC Source,仅消费 MySQL Binlog 协议)。
- 更新同一行中的普通 VARCHAR 字段,不修改 TEXT 字段。
- 实际收到的 Binlog 数据中,TEXT 字段仍然为完整内容,并未出现文档描述的 NULL。
【附件及日志】
目前暂无,如需要可以补充建表 SQL、测试 SQL、Binlog 输出内容以及消费到的 SourceRecord 数据。
感谢各位老师解答!
7 个赞
论坛小助手
#4
感谢您的详细描述,针对您提到的几个问题,我将逐一进行回答。不过,请注意根据现有文档片段并未直接提供所有问题的答案,我会基于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内部机制,建议深入研究其源代码并参与社区交流。
希望以上答复对您有所帮助!若还有更多具体技术问题或其他方面的需求,请随时告知。
详情请参考:
- 合并
- MySQL Connector/C 连接 OceanBase 数据库示例程序
- 分区交换
- 数据备份相关视图介绍
2 个赞
感谢回复。这个论坛不就是官方论坛了吗?你的意思是要连系商业技术支持人员?
淇铭
#7
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 个赞