开发者社区 问答 正文

LOST_EVENTS 支持

我用的Canal版本是 1.0.22。

我们在分析MySQL replication时可能出现的LOST_EVENTS。我查看了一下源码,感觉Canal不支持LOST_EVENTS的处理,而是在读取到这个event后,在将其转换成Entry时给丢掉了。请问Canal是特意设计成这样的行为的吗,或是我们理解有误?

我们分析的如下代码:

在LogDecoder.java中, INCIDENT_EVENT 是会被读取到的。

case LogEvent.INCIDENT_EVENT: { IncidentLogEvent event = new IncidentLogEvent(header, buffer, descriptionEvent); /* updating position in context */ logPosition.position = header.getLogPos(); return event; }

但是在 LogEventConvert.java 中的 parse 方法,并没有处理这个INCIDENT_EVENT。

public Entry parse(LogEvent logEvent) throws CanalParseException { if (logEvent == null || logEvent instanceof UnknownLogEvent) { return null; }

int eventType = logEvent.getHeader().getType();
switch (eventType) {
    ...... ( 这里没有 case LogEvent.INCIDENT_EVENT)
}

是不是 Canal 认为,即使读取到这个事件,consumer拿到也无能为力,所以就主动丢弃了? 如果能主动报一个告警会不会有帮助?

原提问者GitHub用户stone-cheng

展开
收起
绿子直子 2023-05-09 12:02:04 73 分享 版权
1 条回答
写回答
取消 提交回答
  • 当时刻意没加,canal的设计是尽可能抽取DML/DDL/DCL的部分内容,并没有全处理所有mysql事件

    原回答者GitHub用户agapple

    2023-05-10 10:31:11
    赞同 展开评论