1. XID_EVENT 是什么?

MySQL Binlog 文件由 event 组成,event 有不同的类型,本文介绍的 XID_EVENT 表示一个事务的提交操作。

举个例子,执行一条事务,然后查看这个事务生成的 Binlog event,如下:

事务 SQL:

begin;

insert into t1 select 1,1;

commit;

生成的 Binlog Event:

mysql> show binlog events in 'mysql-bin.000003';

+------------------+-----+----------------+-----------+-------------+---------------------------------------------------------------------+

| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |

+------------------+-----+----------------+-----------+-------------+---------------------------------------------------------------------+

| mysql-bin.000003 | 4 | Format_desc | 10 | 123 | Server ver: 5.7.19-17-debug-log, Binlog ver: 4 |

| mysql-bin.000003 | 123 | Previous_gtids | 10 | 194 | b0d850c2-dbd0-11e9-90c3-080027b8bded:1-387 |

| mysql-bin.000003 | 194 | Gtid | 10 | 259 | SET @@SESSION.GTID_NEXT= 'b0d850c2-dbd0-11e9-90c3-080027b8bded:388' |

| mysql-bin.000003 | 259 | Query | 10 | 329 | BEGIN |

| mysql-bin.000003 | 329 | Table_map | 10 | 373 | table_id: 154 (db.t1) |

| mysql-bin.000003 | 373 | Write_rows | 10 | 417 | table_id: 154 flags: STMT_END_F |

| mysql-bin.000003 | 417 | Xid | 10 | 448 | COMMIT /* xid=3247 */ |

+------------------+-----+----------------+-----------+-------------+---------------------------------------------------------------------+

7 rows in set (0.00 sec)

其中 Event_type 为 Xid 的 event 就是本文要介绍的 XID_EVENT,本文涉及的 MySQL 源码版本为 5.7.19。

2. XID_EVENT 格式

XID_EVENT 属于控制类的 event,在源码文件 libbinlogevents/src/control_events.cpp 中,看到如下解析 XID_EVENT 的一段代码,实际上这个 event 只存储了事务提交的 ID,这个 ID 使用 8 字节存储,代码如下:

Xid_event::

Xid_event(const char* buf,

const Format_description_event *description_event)

:Binary_log_event(&buf, description_event->binlog_version,

description_event->server_version)

{

//buf is advanced in Binary_log_event constructor to point to

//beginning of post-header

/*

We step to the post-header despite it being empty because it could later be

filled with something and we have to support that case.

The Variable Data part begins immediately.

*/

buf+= description_event->post_header_len[XID_EVENT - 1];

memcpy((char*) &xid, buf, 8);

}

因此,XID_EVENT 结构如下:

event header(19字节)

event data(即xid,8字节)

event checksum(4字节)

event header 格式是固定的,大小为 19 字节,参见:MySQL Binlog文件格式解析,其中 event type 值为 XID_EVENT,也就是 16。

event data 存储的是 xid 值,即事务提交 ID,占用 8 个字节。

event checksum,4 字节,checksum 校验码,每个 event 都会有。

使用 hexdump 解析 binlog 文件看看是不是符合这个结构。

根据前面 show binlog events in 'mysql-bin.000003'; 的输出,查找到 Xid 起始位置为 417,结束位置为 448,也就是说这个 event 占用 31 个字节,使用 hexdump 解析,命令如下:

hexdump -C -s 417 -n 31 mysql-bin.000003

[root@localhost data_5.7.19]# hexdump -C -s 417 -n 31 mysql-bin.000003

000001a1 72 3a 5c 5f 10 0a 00 00 00 1f 00 00 00 c0 01 00 |r:\_............|

000001b1 00 00 00 af 0c 00 00 00 00 00 00 25 9b ba 89 |...........%...|

000001c0

以上结果可以看到,前 19 个字节为 event header,其中 event_type 为 第 5 个字节,0x10,也就是 16,确实是 XID_EVENT。中间 8 个字节为 Xid,最后 4 个字节为 event 的 checksum值。

mysql xid_MySQL Binlog 文件格式解析(XID_EVENT)相关推荐

  1. 【数据库篇】MySQL InnoDB ibd 文件格式解析

    mysql innodb的表由.frm .ibd 组成,frm:存了每个表的元数据,包括表结构的定义等:ibd:存了每个表的元数据,包括表结构的定义等: 1.0 ibd文件基本结构 ibd文件由Tab ...

  2. 解析mysqlbinlog日志_每日学点---Mysql的binlog日志解析导出

    查询binlog #查询是否开启binlogshow variables like '%log_bin%'#查看binlog模式(row,statement,mixed)show variables ...

  3. Innodb存储引擎-idb文件格式解析

    文章目录 ibd 文件格式解析 idb文件 page类型和格式(File Header & Trailer) FIL_PAGE_TYPE_FSP_HDR 格式 Extent Descripto ...

  4. mysql中间件DDRS_深入解析中间件之-Canal

    canal: 阿里巴巴mysql数据库binlog的增量订阅&消费组件 MySQL binlog MySQL主从复制 mysql服务端修改配置并重启 $ vi /etc/my.cnf [mys ...

  5. mysql增量同步kafka_canal解析mysql的binlog实时推送到kafka

    今天整理一下以前写的一个kafka消费canal的demo,实现实时推送数据到kafka.首先先介绍一下canal,官网是这么说的: 主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和 ...

  6. 数据采集之解析Mysql的binlog日志发送至Kafka实时消费(转:https://blog.csdn.net/liguohuabigdata/article/details/79472777)

    本文采用Maxwell来实现实时解析mysql的binlog日志发送至kafka 1.开启mysql binlog 环境中mysql是docker容器,所以需要进入容器修改mysql配置.docker ...

  7. (4.7)mysql备份还原——深入解析二进制日志(3)binlog的三种日志记录模式详解...

    关键词:binlog模式,binlog,二进制日志,binlog日志 目录概述 0.binlog概述 查看binlog日志参数设置: show variables like '%log_bin%'; ...

  8. mysql之 binlog维护详细解析(开启、binlog相关参数作用、mysqlbinlog解读、binlog删除)...

    binary log 作用:主要实现三个重要的功能:用于复制,用于恢复,用于审计. binary log 相关参数: log_bin 设置此参数表示启用binlog功能,并指定路径名称 log_bin ...

  9. mysql mongodb binlog_订阅MongoDB的数据变更比解析mysql的binlog更简单

    前言 我们开源了一个订阅分发mysql的binlog的项目,一直用的非常好,忽然有天开发说能不能支持MongoDB的数据订阅呢,MongoDB的使用度也挺广泛的.安排.经过简单的了解后发现MongoD ...

最新文章

  1. iOS设计模式(02):单例模式
  2. C#.NET常见问题(FAQ)-命名空间namespace如何理解
  3. 虚拟机克隆,并设置新的ip,配置hostname,配合hostname,hosts
  4. 【BZOJ1899】[Zjoi2004]Lunch 午餐 贪心+DP
  5. python3爬虫(5)百度云盘暴力破解尝试
  6. 文本内容之间的关键词提取和相似度计算
  7. 计算机视觉中的多视图几何_基于深度学习的视觉三维重建研究总结
  8. 5行Python 代码就能让你的电脑永不息屏
  9. DIV CSS BackGround属性研究
  10. chrome extensions快捷键shortcuts配置
  11. 时间轮定时器-Timewheel
  12. python数据可视化之疫情地图爬虫(含完整代码以及具体报告)
  13. fastboot 操作
  14. 秋招知识点总结-Redis数据库
  15. OSM(OpenStreetMap)使用简述
  16. samba 配置文件详解
  17. 怎么提取音乐中的伴奏?分享一个超好用的方法
  18. 无忧计算机二级试题题库,计算机等级考试题库,二级Web试题
  19. AJAX请求和普通HTTP请求区别(postman分析)
  20. 一欧拉函数(Euler‘s totient function)

热门文章

  1. 中国石油大学《法学导论》第二次在线作业
  2. echarts地图分布-实例
  3. java -jar xxx.jar设置JVM参数问题
  4. python pathlib中Path 的使用(解决不同操作系统的路径问题)
  5. 【软件相关】如何制作RSS源?
  6. TSINGSEE车载视频监控平台,助力“两客一危”智能化监管
  7. 玫瑰花数java代码_c语言如何输出玫瑰花数?(代码示例)
  8. 三星手机摔一下,就花屏啦!!
  9. 基于springboot的旅游景点管理系统
  10. 【OSChina-MoPaaS应用开发大赛】报纸订购系统 --- 新界面