23 open-replicator 解析binlog失败 available: 4, event type: 19

2024-05-28 15:38

本文主要是介绍23 open-replicator 解析binlog失败 available: 4, event type: 19,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题出现

使用 open-replicator 来解析 binLog 的时候出现了这个问题, 这个包 似乎是14年之后 就没有杂更新了

open-replicator 的版本是现在的最新的版本1.0.7, 详情请见 参考的ref


15:55:33.435 [binlog-parser-1] ERROR c.g.c.o.b.impl.AbstractBinlogParser - failed to parse binlog
java.lang.RuntimeException: assertion failed, available: 4, event type: 19at com.google.code.or.binlog.impl.FileBasedBinlogParser.doParse(FileBasedBinlogParser.java:141) ~[open-replicator-1.0.7.jar:na]at com.google.code.or.binlog.impl.AbstractBinlogParser$Task.run(AbstractBinlogParser.java:244) ~[open-replicator-1.0.7.jar:na]at java.lang.Thread.run(Thread.java:745) [na:1.7.0_79]


然后 跟到代码里面去瞅了瞅, 
FileBasedBinlogParser.doParse 108 - 149, 是挂在了下面的 " if(is.available() != 0) {"

		while(isRunning() && is.available() > 0) {try {//final BinlogEventV4HeaderImpl header = new BinlogEventV4HeaderImpl();header.setTimestamp(is.readLong(4) * 1000L);header.setEventType(is.readInt(1));header.setServerId(is.readLong(4));header.setEventLength(is.readInt(4));header.setNextPosition(is.readLong(4));header.setFlags(is.readInt(2));header.setBinlogFileName(this.binlogFileName);header.setTimestampOfReceipt(System.currentTimeMillis());is.setReadLimit((int)(header.getEventLength() - header.getHeaderLength())); // Ensure the event boundaryif(isVerbose() && LOGGER.isInfoEnabled()) {LOGGER.info("read an event, header: {}", header);}//if(this.stopPosition > 0 && header.getPosition() > this.stopPosition) {break;}// Parse the event bodyif(this.eventFilter != null && !this.eventFilter.accepts(header, context)) {this.defaultParser.parse(is, header, context);} else {BinlogEventParser parser = getEventParser(header.getEventType());if(parser == null) parser = this.defaultParser;parser.parse(is, header, context);}// Ensure the packet boundaryif(is.available() != 0) {throw new RuntimeException("assertion failed, available: " + is.available() + ", event type: " + header.getEventType());}} catch(Exception e) {IOUtils.closeQuietly(is);throw e;} finally {is.setReadLimit(0);}}


首先是一个 FormatDescriptionEventParser, binlog 的版本号之类的东西
然后 之后的时候, 是一个 QueryEventParser
然后 之后是一个 TableMapEventParser, 然后 就是在这一步的 "parser.parse(is, header, context);" 之后, 

is.available() 得到的是 日志中的4, 

XInputStream.available 185 - 189

		if(this.readLimit > 0) {return this.readLimit - this.readCount;} else {return this.tail - this.head + this.is.available();}



就是这里 this.readLimit - this.readCount;
然后 想了一下 可不可能是 mysql binLog 和当前使用的 open-replicator 的版本不匹配呢, 
然后 当前使用的是 1.0.7, 然后 我把其版本改成了 1.0.6, 之后 就没有报这个问题了,


shit 原来是由于 1.0.6 拿到异常之后没有 打出来, 因此 我没有看到这个问题, 呵呵呵 还以为自己又机智了一会呢,,


问题临时解决

下午的时候, 对于 open-replicator 总共更新了几个地方 : TableMapEventParser, XidEventParser, WriteRowsEventParser, UpdateRowsEventParser, DeleteRowsEventParser, 基本上就是消耗 binlog 中的多出来的四个字节, 这四个字节有什么作用我也不知道, 官方文档上也没找到, 搜索也没有搜索到, 已经满足了我现在的需求[可能 还有一些地方还有需要处理的地方]
结合下午的研习, 晚上的时候, 瞅了瞅官方文档, 整理了一下 两个不同的地方, 
有两个不同的地方, 一就是, TableMapEvent body 增加了四个字节, CU Event 增加了四个字节, D 最后增加了四个字节
第二 就是 WRITE_ROWS_EVENT 的 ExtraInfo 部分,, 
前者是 binlog中有的, 然后 open-replicator 中没有, mysql官方文档也没有, 
然后 后者是 binlog 中有的, 然后 open-replicator 中有, mysql 官方文档中没有,, 
我去 xxx, 可能是我没找到吧 ???


记录一下 


======================= add at 2017.08.10 ======================= 

哦, 说一说后面的事情吧, 后来没过多久我就想到, 可能虽然 原开发人员没有维护open-replicator了, 但是 还有别的朋友 fork open-replpicator, 然后 继续维护的吧, 然后 就来瞅了瞅, 果然不少, 然后 找了一个维护相对来说比较稳定的朋友[zendesk]的 open-replicator, clone 下来, 然后 打包什么的, 感谢原作者 以及这位朋友






参考连接

下面的一系列链接, 才是吊炸天的存在


whitesock/open-replicator
https://github.com/whitesock/open-replicator
https://github.com/zendesk/open-replicator/

20.5 Event Classes and Types
https://dev.mysql.com/doc/internals/en/event-classes-and-types.html
20.7 Event Structure
https://dev.mysql.com/doc/internals/en/event-structure.html
20.8 Binary Log Versions [START_EVENT]
https://dev.mysql.com/doc/internals/en/binary-log-versions.html
20.9 Event Data for Specific Event Types
https://dev.mysql.com/doc/internals/en/event-data-for-specific-event-types.html


4.6.7 mysqlbinlog — Utility for Processing Binary Log Files
https://dev.mysql.com/doc/refman/5.7/en/mysqlbinlog.html
4.6.7.1 mysqlbinlog Hex Dump Format
https://dev.mysql.com/doc/refman/5.7/en/mysqlbinlog-hexdump.html
4.6.7.2 mysqlbinlog Row Event Display

https://dev.mysql.com/doc/refman/5.7/en/mysqlbinlog-row-events.html


这篇关于23 open-replicator 解析binlog失败 available: 4, event type: 19的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1010978

相关文章

pip install jupyterlab失败的原因问题及探索

《pipinstalljupyterlab失败的原因问题及探索》在学习Yolo模型时,尝试安装JupyterLab但遇到错误,错误提示缺少Rust和Cargo编译环境,因为pywinpty包需要它... 目录背景问题解决方案总结背景最近在学习Yolo模型,然后其中要下载jupyter(有点LSVmu像一个

C语言中自动与强制转换全解析

《C语言中自动与强制转换全解析》在编写C程序时,类型转换是确保数据正确性和一致性的关键环节,无论是隐式转换还是显式转换,都各有特点和应用场景,本文将详细探讨C语言中的类型转换机制,帮助您更好地理解并在... 目录类型转换的重要性自动类型转换(隐式转换)强制类型转换(显式转换)常见错误与注意事项总结与建议类型

Ollama整合open-webui的步骤及访问

《Ollama整合open-webui的步骤及访问》:本文主要介绍如何通过源码方式安装OpenWebUI,并详细说明了安装步骤、环境要求以及第一次使用时的账号注册和模型选择过程,需要的朋友可以参考... 目录安装环境要求步骤访问选择PjrIUE模型开始对话总结 安装官方安装地址:https://docs.

MySQL 缓存机制与架构解析(最新推荐)

《MySQL缓存机制与架构解析(最新推荐)》本文详细介绍了MySQL的缓存机制和整体架构,包括一级缓存(InnoDBBufferPool)和二级缓存(QueryCache),文章还探讨了SQL... 目录一、mysql缓存机制概述二、MySQL整体架构三、SQL查询执行全流程四、MySQL 8.0为何移除查

在Rust中要用Struct和Enum组织数据的原因解析

《在Rust中要用Struct和Enum组织数据的原因解析》在Rust中,Struct和Enum是组织数据的核心工具,Struct用于将相关字段封装为单一实体,便于管理和扩展,Enum用于明确定义所有... 目录为什么在Rust中要用Struct和Enum组织数据?一、使用struct组织数据:将相关字段绑

使用Java实现一个解析CURL脚本小工具

《使用Java实现一个解析CURL脚本小工具》文章介绍了如何使用Java实现一个解析CURL脚本的工具,该工具可以将CURL脚本中的Header解析为KVMap结构,获取URL路径、请求类型,解析UR... 目录使用示例实现原理具体实现CurlParserUtilCurlEntityICurlHandler

深入解析Spring TransactionTemplate 高级用法(示例代码)

《深入解析SpringTransactionTemplate高级用法(示例代码)》TransactionTemplate是Spring框架中一个强大的工具,它允许开发者以编程方式控制事务,通过... 目录1. TransactionTemplate 的核心概念2. 核心接口和类3. TransactionT

数据库使用之union、union all、各种join的用法区别解析

《数据库使用之union、unionall、各种join的用法区别解析》:本文主要介绍SQL中的Union和UnionAll的区别,包括去重与否以及使用时的注意事项,还详细解释了Join关键字,... 目录一、Union 和Union All1、区别:2、注意点:3、具体举例二、Join关键字的区别&php

开启mysql的binlog日志步骤详解

《开启mysql的binlog日志步骤详解》:本文主要介绍MySQL5.7版本中二进制日志(bin_log)的配置和使用,文中通过图文及代码介绍的非常详细,需要的朋友可以参考下... 目录1.查看是否开启bin_log2.数据库会把日志放进logs目录中3.查看log日志总结 mysql版本5.71.查看

Spring IOC控制反转的实现解析

《SpringIOC控制反转的实现解析》:本文主要介绍SpringIOC控制反转的实现,IOC是Spring的核心思想之一,它通过将对象的创建、依赖注入和生命周期管理交给容器来实现解耦,使开发者... 目录1. IOC的基本概念1.1 什么是IOC1.2 IOC与DI的关系2. IOC的设计目标3. IOC