博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL的XA_prepare_event类型binlog的解析
阅读量:5247 次
发布时间:2019-06-14

本文共 1798 字,大约阅读时间需要 5 分钟。

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

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

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

MySQL中一共有

但是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的作者提了,作者很友好也很迅速的修改了相关的代码

 

现在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= 0;  uint8_t temp_byte;  buf+= description_event->post_header_len[XA_PREPARE_LOG_EVENT - 1];  memcpy(&temp_byte, buf, 1);  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);}
View Code

从源码中我们可以知道,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的解析器了

 

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

转载于:https://www.cnblogs.com/stevenczp/p/6837159.html

你可能感兴趣的文章
list删除、集合遍历删除
查看>>
iOS设计模式——委托(delegate)
查看>>
Java ee 之 html/css样式复习
查看>>
为树莓派3B添加LCD1602液晶屏
查看>>
linux下echo命令详解
查看>>
Java基础_正则表达
查看>>
centos 更新linux内核
查看>>
GYM 101964 C(二分答案)
查看>>
python中定义函数时,self怎么理解:
查看>>
经典SQL查询语句大全
查看>>
字典项(英文转中文)
查看>>
【图表库】 Highchart / Echart 常见问题
查看>>
趣谈Java变量的可见性问题
查看>>
图标字体制作 -- 将SVG制作成图标字体文件,通过引入使用
查看>>
为Eclipse添加C/C++开发工具
查看>>
杭州互联网公司汇总
查看>>
Sublime text3 注册失效解决方法
查看>>
C# 强制关闭当前程序进程(完全Kill掉不留痕迹)
查看>>
ssm框架之将数据库的数据导入导出为excel文件
查看>>
电压驱动与电流驱动
查看>>