异常如下:
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
出现TableIdNotFoundException,主要是你binlog的起始位点不是一个事务开头或者结尾,只能重置下位点
原回答者GitHub用户agapple
这个异常信息显示Canal在解析binlog事件时出现了错误,具体原因可能是由于binlog格式的变化或者Canal版本的升级导致的。你可以尝试以下几个方法:
检查Canal版本是否与MySQL版本兼容。可以查看官方文档或者Canal的GitHub页面来确认版本兼容性。
检查binlog格式是否与Canal兼容。Canal只支持ROW格式的binlog,如果你的MySQL使用的是其他格式的binlog,需要将其转换为ROW格式。
尝试清空Canal的meta信息并重新启动。你可以在Canal的conf目录中找到meta.dat文件并将其删除,然后重新启动Canal。这样Canal会重新解析binlog事件并重建meta信息,可能会解决一些不明原因导致的解析错误。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。