为了支持新版的xa事务,MySQL新加了一种binlog event类型:XA_prepare

项目中使用的开源组件mysql-binlog-connector-java无法解析此种binlog event

分析源码后发现第一个问题:

MySQL中一共有39种binlog event

但是mysql-binlog-connector-java组件只写了38种binlog event,少了一种名为TRANSACTION_CONTEXT的binlog event,导致无法解析TRANSACTION_CONTEXT_EVENT/VIEW_CHANGE_EVENT/XA_PREPARE_LOG_EVENT类型的binlog event

修改完本地分支后,顺手向mysql-binlog-connector-java的作者提了一个issue,作者很友好也很迅速的修改了相关的代码

现在mysql-binlog-connector-java可以识别出XA_prepare的binlog event了,但是只是识别出来而已,我还要需要对这种binlog event进行反序列化

网上没有现成的资料,在MySQL的代码库里翻了一通后终于找到了关键代码

XA_prepare_event::
XA_prepare_event(const char* buf,
const Format_description_event *description_event)
: Binary_log_event(&buf, description_event->binlog_version,
description_event->server_version)
{
uint32_t temp= ;
uint8_t temp_byte; buf+= description_event->post_header_len[XA_PREPARE_LOG_EVENT - ];
memcpy(&temp_byte, buf, );
one_phase= (bool) temp_byte;
buf += sizeof(temp_byte);
memcpy(&temp, buf, sizeof(temp));
my_xid.formatID= le32toh(temp);
buf += sizeof(temp);
memcpy(&temp, buf, sizeof(temp));
my_xid.gtrid_length= le32toh(temp);
buf += sizeof(temp);
memcpy(&temp, buf, sizeof(temp));
my_xid.bqual_length= le32toh(temp);
buf += sizeof(temp);
memcpy(my_xid.data, buf, my_xid.gtrid_length + my_xid.bqual_length);
}

从源码中我们可以知道,XA_prepare类型的binlog event的数据部分结构如下:

one_phase : boolean, 1byte

formatID : int, 4byte

gtrid_length : int, 4byte

bqual_length : int, 4byte

data : String, gtrid + bqual, (gtrid_length + bqual_length)byte

例如[0, 123, 0, 0, 0, 5, 0, 0, 0, 5, 0, 0, 0, 103, 116, 114, 105, 100, 98, 113, 117, 97, 108]

就对应为:

one_phase:false

formatID : 123

gtrid_length : 5

bqual_length : 5

data : "gtridbqual"  ---> gtrid = "gtrid", bqual = "bqual"

于是可以很容易的写出XA_prepare类型的binlog event的解析器了

顺手提了个pr,已经被作者合进去了

MySQL的XA_prepare_event类型binlog的解析的更多相关文章

  1. Mysql binlog日志解析

    1. 摘要: Mysql日志抽取与解析正如名字所将的那样,分抽取和解析两个部分.这里Mysql日志主要是指binlog日志.二进制日志由配置文件的log-bin选项负责启用,Mysql服务器将在数据根 ...

  2. MySQL binlog格式解析

    MySQL binlog格式解析   binlog想必大家都不陌生,在主从复制或者某些情况下的数据恢复会用到.由于binlog是二进制数据,要查看一般都借助mysqlbinlog工具.这篇笔记分析了b ...

  3. 20180705关于mysql binlog的解析方式

    来自:https://blog.csdn.net/u012985132/article/details/74964366/ 关系型数据库和Hadoop生态的沟通越来越密集,时效要求也越来越高.本篇就来 ...

  4. MySQL 5.7 - 通过 BINLOG 恢复数据

    日常开发,运维中,经常会出现误删数据的情况.误删数据的类型大致可分为以下几类: 使用 delete 误删行 使用 drop table 或 truncate table 误删表 使用 drop dat ...

  5. mysql小白系列_04 binlog(未完)

    mysql打开.查看.清理binlog 1.开启日志 log_bin=/var/lib/mysql/mysql-bin mysql> show variables like '%log_bin% ...

  6. taskctl实现自定义mysql存储过程作业类型调用

    TASKCTL支持任意作业类型的扩展,但目前TASKCTL 4.1.3版本中并没有内置mysql存储过程的作业插件.通过介绍使TASKCTL支持调度mysql存储过程作业类型的步骤,一方面解决一些朋友 ...

  7. MySQL系列:基于binlog的增量订阅与消费(一)

    在一些业务场景中,像在数据分析中我们有时候需要捕获数据变化(CDC):在数据审计中,我们也往往需要知道数据从这个点到另一个点的变化:同样在实时分析中,我们有时候需要看到某个值得实时变化等. 要解决以上 ...

  8. mysql之 innobackupex备份+binlog日志的完全恢复【转】

    前言: MySQL的完全恢复,我们可以借助于完整的 备份+binlog 来将数据库恢复到故障点. 备份可以是热备与逻辑备份(mysqldump),只要备份与binlog是完整的,都可以实现完全恢复. ...

  9. 扩展mybatis和通用mapper,支持mysql的geometry类型字段

    因项目中需要用到地理位置信息的存储.查询.计算等,经过研究决定使用mysql(5.7版本)数据库的geometry类型字段来保存地理位置坐标,使用虚拟列(Virtual Generated Colum ...

随机推荐

  1. windows服务自动备份数据库

    最近写了几个windows服务用于自动备份与删除数据: services代码如下: public partial class Service1 : ServiceBase { public Servi ...

  2. sql server备份

    完全备份 declare @device varchar(255),@path varchar(255),@dbname varchar(255)set @dbname='MIS_TEMP'set @ ...

  3. 62、在app遇到全局异常时避免直接退出,如何让app接管异常处理?

    1.创建一个类为CrashHandler import android.content.Context; import android.os.Looper; import android.util.L ...

  4. leetcode 【 Remove Duplicates from Sorted Array II 】python 实现

    题目: Follow up for "Remove Duplicates":What if duplicates are allowed at most twice? For ex ...

  5. ios开发学习笔记040-autolayout 第三方框架Masonry

    不管是是界面创建约束还是代码创建约束,苹果官方提供的方式都比较繁琐.所以出现了第三方框架. Masonry 在github地址如下: https://github.com/SnapKit/Masonr ...

  6. error C2011: “Picture”:“struct”类型重定义

    今天引用外来库时出现问题,也许是版本问题. 错误如下: .....\oursun\cincludes\quickdraw.h(309): error C2011: “Picture”:“struct” ...

  7. git基础之常用操作

    一.版本提交: (1)git add 文件名 (2)git commit -m "版本提交信息" 注:git分两个区:工作区+版本库 在电脑中看到的文件夹就是工作区 有一个隐藏的. ...

  8. [转载]用等高线图(Contour maps)可视化多变量函数

    https://blog.csdn.net/xlinsist/article/details/50920479 Overview 由于我们用手来画三维图像很困难,我们可以用等高线图来描述图像会更加简单 ...

  9. c++11特性使用

    #include <list> #include <iostream> int main(){ list<int> lst; for(list<int> ...

  10. struts ValueStack 详解

    一.ValueStack     1.ValueStack是一个接口,在struts2中使用OGNL(Object-Graph Navigation Language)表达式实际上是使用        ...