三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

套壳LogMiner的DBZ与Flink cdc方案,永远绕不开这个死结

套壳LogMiner的DBZ与Flink cdc方案,永远绕不开这个死结

聊个实际的事。

前段时间跟一个做数据平台的朋友吃饭,他说他们团队用Debezium做了大半年的Oracle增量采集,最近准备全盘换掉。我问他为什么,他说了一句让我印象很深的话:“有些问题你知道怎么修,但你修不了。”

仔细一想,确实是这么回事。

你遇到的是Bug,但你改不了

他们遇到的第一件事:表名长度超30个字符,LogMiner直接忽略不抓。

日志里清清楚楚写着:Table 'XXX' won't be captured by Oracle LogMiner because its name exceeds 30 characters。Oracle 12c开始表名最大长度已经支持128个字符了,他们用的就是19c,表能正常建,但LogMiner不认。

他们去找解决方案,官方文档写的建议是——“请限制表名和列名都<=30个字符”。

什么意思?你改表名。

几十张表、几百个字段,下游还有一堆依赖这些表名的应用。改表名?根本不可能。

他们去找社区问能不能改LogMiner的阈值,得到的回复是:LogMiner是Oracle内核的一部分,改不了。

第二个问题:大事务导致OOM。业务方半夜跑了个批量更新,一百多万行。Debezium任务直接崩了,报OutOfMemoryError: Java heap space。Debezium社区说3.2版本会引入新的缓存机制来应对这类事务——但那是“未来版本”,他们等不了。

第三个问题:SCN跳跃导致追不上最新数据。Flink CDC的官方Issue里有人反馈,当SCN快速增长时,LogMiner无法及时捕获最新记录。问题的根因是LogMiner在每次处理完数据后无法反馈合理的lastProcessedScn。社区在修,但什么时候能修好?不知道。

第四个问题:RAC环境下日志切换时报错。Redo日志切换时,Flink CDC可能丢失上下文或无法正确解析新的日志文件。还是那个模式——社区在修,但你在生产环境等不起。

这些事情有一个共同点:你解决不了。

不是技术不行,是根本没权限。

Debezium和Flink CDC的Oracle连接器,底层调的是Oracle LogMiner。LogMiner是闭源的、黑盒的、你动不了的。你能改的只有外面那层壳——配置参数、调优线程池、加大内存——核心的黑盒你碰不到。

但很多问题的根因就在黑盒里面。外面再怎么调优,也只是在“缓解”症状,治不了本。

自研和套壳的本质区别

TLA走的是另一条路——不碰LogMiner,直接解析redo log的二进制格式。

这个选择带来的差异,比大多数人想象的要大得多。

1. 发现问题就能修,不用等。

用开源方案,你发现一个Bug,流程是这样的:提Issue → 等社区确认 → 等排期 → 等发版 → 等升级。快则几个月,慢则一两年。有些Issue挂了几年都没人动。

用TLA,发现Bug?直接改。今天发现,明天就能上线。

这不是效率高一点的问题,而是你能不能解决问题的问题。

2. 个性化需求,不用“等排期”。

每个企业的数据环境都不一样。有的需要特殊的日志解析逻辑,有的需要对接特定的下游系统,有的需要定制化的数据格式,有的需要适配特定的国产数据库。

用开源方案,这些需求你只能提Feature Request,然后等。社区有自己的Roadmap,你的需求优先级排在后面,你就只能等着。

用TLA,源码在自己手上,想怎么改怎么改。今天提需求,明天就能改好上线。

3. 不受上游版本变化影响。

Oracle升级了,LogMiner行为变了,某些功能deprecated了——用Debezium和Flink CDC的人只能被动跟着变,还得祈祷社区能及时跟进。

TLA自己控制解析逻辑,不受Oracle版本策略影响。Oracle怎么改,跟TLA没关系。

4. 不依赖外部组件的“黑盒行为”。

LogMiner有一些“特性”,比如处理LONG和LONG RAW类型时,根据数据长度不同会以两种不同方式提供数据。Debezium社区自己都承认,LONG和LONG RAW通过Xstream可以安全支持,因为GoldenGate能区分redo条目中的断点,但LogMiner做不到

这个问题Debezium解决不了,因为问题在LogMiner里面。TLA直接解析二进制,自己控制解析逻辑,不受LogMiner这些“特性”的影响。

5. 不上传任何数据,合规可控。

这点在金融、政务等对数据安全要求极高的行业尤其重要。使用基于LogMiner的开源方案,虽然数据本身不会上传,但连接器需要与Oracle数据库建立连接并执行LogMiner相关的API调用,整个解析过程依赖Oracle的闭源组件。

TLA是纯国产自研,整个解析链路从日志读取到块解析到事务还原全部自己控制,不依赖任何外部闭源组件。代码在自己手上,安全审计、合规检查都能过。

一个很实在的对比

场景Debezium/Flink CDC (LogMiner)TLA (自研)
表名超30字符无法处理,官方建议改表名无限制,直接改代码适配
大事务OOM等社区新版本,调大堆内存治标不治本流式处理,内存平稳,发现问题直接修
SCN跳跃追不上社区Issue挂了好几个月自己控制解析逻辑,调整策略
新数据类型支持等LogMiner支持,等Debezium适配自己加解析逻辑
RAC日志切换丢数据等社区修直接读磁盘,跟切换没关系
备库CDC需要逻辑备库直接读备库日志
国产数据库适配不支持正在推进,自己改代码适配
数据安全合规依赖Oracle闭源组件纯国产自研,全链路可控

说句实在话

Debezium和Flink CDC都是优秀的开源项目,在MySQL、PG这些数据库上确实好用。问题出在Oracle这里——它们被LogMiner卡住了脖子

LogMiner的设计初衷是诊断工具,不是为持续高吞吐的CDC设计的。拿诊断工具当同步工具用,遇到各种限制和问题几乎是必然的。

但最让人难受的不是问题本身,而是你知道问题在哪,但你改不了

TLA做的事情说起来很简单——换一种方式解析日志,绕开LogMiner的所有限制。但要做到这一点,需要把Oracle各个版本的redo log格式全部吃透,需要自己实现事务语义的完整还原,需要自己处理各种边界情况。

这条路走通了,就意味着:遇到任何日志解析相关的问题,你都能解决。不需要等任何人。

这就是完全自主和套壳方案的根本区别。

欢迎交流。


补充:文中提到的社区Issue和用户反馈均来自公开的GitHub Issue、邮件列表和技术社区,可自行查证。性能数据来自内部测试环境,实际效果受硬件配置、数据库版本、日志大小等因素影响。

← 返回列表