开发者社区> 问答> 正文

重启canal后某些情况下parseEvent失败无法继续

异常如下:

2014-09-23 12:49:09.635 [destination = db2 , address = /10.15.2.116:3306 , EventParser] ERROR com.alibaba.otter.canal.common.alarm.LogAlarmHandler - destination:db2[com.alibaba.otter.canal.parse.exception.CanalParseException: com.alibaba.otter.canal.parse.exception.CanalParseException: parse row data failed. Caused by: com.alibaba.otter.canal.parse.exception.CanalParseException: parse row data failed. Caused by: com.alibaba.otter.canal.parse.exception.TableIdNotFoundException: not found tableId:71

此异常会一直不断重复,导致binlog的消费停留在此LogPosition不往下继续。

触发场景: 停掉canal后启动.

异常情况原因推断是因为重启后遇到的binlog event没有TABLE_MAP_EVENT开头,而恰好直接出现后续的event,导致logContext的table字段未设置

通过查询异常的出现点在:

com.alibaba.otter.canal.parse.inbound.mysql.dbsync.LogEventConvert private Entry parseRowsEvent(RowsLogEvent event) { try { TableMapLogEvent table = event.getTable(); if (table == null) { // tableId对应的记录不存在 throw new TableIdNotFoundException("not found tableId:" + event.getTableId()); } ...

event的table字段设置:

com.taobao.tddl.dbsync.binlog.event.RowsLogEvent public final void fillTable(LogContext context) { table = context.getTable(tableId);

    // end of statement check:
    if ((flags & RowsLogEvent.STMT_END_F) != 0)
    {
        // Now is safe to clear ignored map (clear_tables will also
        // delete original table map events stored in the map).
        context.clearAllTables();
    }
}

com.taobao.tddl.dbsync.binlog.LogContext public final void putTable(TableMapLogEvent mapEvent) { mapOfTable.put(Long.valueOf(mapEvent.getTableId()), mapEvent); }

com.taobao.tddl.dbsync.binlog.LogDecoder.decode 方法 case LogEvent.TABLE_MAP_EVENT: { TableMapLogEvent mapEvent = new TableMapLogEvent(header, buffer, descriptionEvent); /* updating position in context */ logPosition.position = header.getLogPos(); context.putTable(mapEvent); return mapEvent; }

原提问者GitHub用户ChinaXing

展开
收起
绿子直子 2023-05-09 16:08:10 164 0
2 条回答
写回答
取消 提交回答
  • 出现TableIdNotFoundException,主要是你binlog的起始位点不是一个事务开头或者结尾,只能重置下位点

    原回答者GitHub用户agapple

    2023-05-10 11:05:44
    赞同 展开评论 打赏
  • 这个异常信息显示Canal在解析binlog事件时出现了错误,具体原因可能是由于binlog格式的变化或者Canal版本的升级导致的。你可以尝试以下几个方法:

    1. 检查Canal版本是否与MySQL版本兼容。可以查看官方文档或者Canal的GitHub页面来确认版本兼容性。

    2. 检查binlog格式是否与Canal兼容。Canal只支持ROW格式的binlog,如果你的MySQL使用的是其他格式的binlog,需要将其转换为ROW格式。

    3. 尝试清空Canal的meta信息并重新启动。你可以在Canal的conf目录中找到meta.dat文件并将其删除,然后重新启动Canal。这样Canal会重新解析binlog事件并重建meta信息,可能会解决一些不明原因导致的解析错误。

    2023-05-10 08:38:58
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载