MySQL的XA_prepare_event类型binlog的解析
为了支持新版的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的解析的更多相关文章
- Mysql binlog日志解析
1. 摘要: Mysql日志抽取与解析正如名字所将的那样,分抽取和解析两个部分.这里Mysql日志主要是指binlog日志.二进制日志由配置文件的log-bin选项负责启用,Mysql服务器将在数据根 ...
- MySQL binlog格式解析
MySQL binlog格式解析 binlog想必大家都不陌生,在主从复制或者某些情况下的数据恢复会用到.由于binlog是二进制数据,要查看一般都借助mysqlbinlog工具.这篇笔记分析了b ...
- 20180705关于mysql binlog的解析方式
来自:https://blog.csdn.net/u012985132/article/details/74964366/ 关系型数据库和Hadoop生态的沟通越来越密集,时效要求也越来越高.本篇就来 ...
- MySQL 5.7 - 通过 BINLOG 恢复数据
日常开发,运维中,经常会出现误删数据的情况.误删数据的类型大致可分为以下几类: 使用 delete 误删行 使用 drop table 或 truncate table 误删表 使用 drop dat ...
- mysql小白系列_04 binlog(未完)
mysql打开.查看.清理binlog 1.开启日志 log_bin=/var/lib/mysql/mysql-bin mysql> show variables like '%log_bin% ...
- taskctl实现自定义mysql存储过程作业类型调用
TASKCTL支持任意作业类型的扩展,但目前TASKCTL 4.1.3版本中并没有内置mysql存储过程的作业插件.通过介绍使TASKCTL支持调度mysql存储过程作业类型的步骤,一方面解决一些朋友 ...
- MySQL系列:基于binlog的增量订阅与消费(一)
在一些业务场景中,像在数据分析中我们有时候需要捕获数据变化(CDC):在数据审计中,我们也往往需要知道数据从这个点到另一个点的变化:同样在实时分析中,我们有时候需要看到某个值得实时变化等. 要解决以上 ...
- mysql之 innobackupex备份+binlog日志的完全恢复【转】
前言: MySQL的完全恢复,我们可以借助于完整的 备份+binlog 来将数据库恢复到故障点. 备份可以是热备与逻辑备份(mysqldump),只要备份与binlog是完整的,都可以实现完全恢复. ...
- 扩展mybatis和通用mapper,支持mysql的geometry类型字段
因项目中需要用到地理位置信息的存储.查询.计算等,经过研究决定使用mysql(5.7版本)数据库的geometry类型字段来保存地理位置坐标,使用虚拟列(Virtual Generated Colum ...
随机推荐
- windows服务自动备份数据库
最近写了几个windows服务用于自动备份与删除数据: services代码如下: public partial class Service1 : ServiceBase { public Servi ...
- sql server备份
完全备份 declare @device varchar(255),@path varchar(255),@dbname varchar(255)set @dbname='MIS_TEMP'set @ ...
- 62、在app遇到全局异常时避免直接退出,如何让app接管异常处理?
1.创建一个类为CrashHandler import android.content.Context; import android.os.Looper; import android.util.L ...
- leetcode 【 Remove Duplicates from Sorted Array II 】python 实现
题目: Follow up for "Remove Duplicates":What if duplicates are allowed at most twice? For ex ...
- ios开发学习笔记040-autolayout 第三方框架Masonry
不管是是界面创建约束还是代码创建约束,苹果官方提供的方式都比较繁琐.所以出现了第三方框架. Masonry 在github地址如下: https://github.com/SnapKit/Masonr ...
- error C2011: “Picture”:“struct”类型重定义
今天引用外来库时出现问题,也许是版本问题. 错误如下: .....\oursun\cincludes\quickdraw.h(309): error C2011: “Picture”:“struct” ...
- git基础之常用操作
一.版本提交: (1)git add 文件名 (2)git commit -m "版本提交信息" 注:git分两个区:工作区+版本库 在电脑中看到的文件夹就是工作区 有一个隐藏的. ...
- [转载]用等高线图(Contour maps)可视化多变量函数
https://blog.csdn.net/xlinsist/article/details/50920479 Overview 由于我们用手来画三维图像很困难,我们可以用等高线图来描述图像会更加简单 ...
- c++11特性使用
#include <list> #include <iostream> int main(){ list<int> lst; for(list<int> ...
- struts ValueStack 详解
一.ValueStack 1.ValueStack是一个接口,在struts2中使用OGNL(Object-Graph Navigation Language)表达式实际上是使用 ...