Mysql binlog 结构基础篇

说明:文章基于Mysql V5.6 或者更高版本!

目录

1.Binlog 简单说明

Mysql Binlog 由许多的Event构成,MySQL 5.6版本中又加入gtid功能,每个事务都会有唯一的一个gtid序号与其对应,这个gtid序号在Binlog中也有一个专门的event类型与之对应,也就是GTID_LOG_EVENT

2.文件内容查看

2.1. 通过Sql语句查看

show binlog events in 'bin文件名'
Mysql binlog 结构基础篇

2.2. 通过命令行查看

mysqlbinlog --no-defaults --start-datetime="2021-12-09 11:20:00" bin文件完整路径
Mysql binlog 结构基础篇

更多操作请参考:Mysql 常用命令收录

3.常见的事件类型

3.1. FORMAT_DESCRIPTION_EVENT

说明:
Binlog version 4中为了取代之前版本中的START_EVENT_V3事件而引入的。它是binlog文件中的第一个事件,而且,该事件只会在binlog中出现一次。MySQL根据FORMAT_DESCRIPTION_EVENT的定义来解析其它事件
Mysql binlog 结构基础篇

作用:
它通常指定了MySQL Server的版本,binlog的版本,该binlog文件的创建时间

3.2. QUERY_EVENT

说明:
以文本的形式来记录事务的操作

作用:

  1. 事务开始时,执行的BEGIN操作。
  2. STATEMENT格式中的DML操作
  3. ROW格式中的DDL操作

示例:
Mysql binlog 结构基础篇

3.3. ROWS_EVENT

说明:
对于ROW格式的binlog,所有的DML语句都是记录在ROWS_EVENT中。
ROWS_EVENT分为三种:WRITE_ROWS_EVENTUPDATE_ROWS_EVENTDELETE_ROWS_EVENT分别对应insert,update和delete操作对于QUERY_EVENT事件,是以文本形式记录DML操作的。而对于ROWS_EVENT事件,并不是文本形式,所以在通过mysqlbinlog查看基于ROW格式的binlog时,需要指定-vv --base64-output=decode-rows

示例:
Mysql binlog 结构基础篇

3.4. XID_EVENT

说明:
在事务提交时,不管是STATEMENT还是ROW格式的binlog,都会在末尾添加一个XID_EVENT事件代表事务的结束。该事件记录了该事务的ID,在MySQL进行崩溃恢复时,根据事务在binlog中的提交情况来决定是否提交存储引擎中状态为prepared的事务

示例:
Mysql binlog 结构基础篇

3.5. ROTATE_EVENT

说明:
当binlog文件的大小达到max_binlog_size的值或者执行flush logs命令时,binlog会发生切换,这个时候会在当前的binlog日志添加一个ROTATE_EVENT事件,用于指定下一个日志的名称和位置

示例:
Mysql binlog 结构基础篇

3.6. GTID_LOG_EVENT

说明:
在启用GTID模式后,MySQL实际上为每个事务都分配了个GTID

补充:
GTID模式由参数“gtid_%”控制,详细如下:
Mysql binlog 结构基础篇
事件存储结构【扩展】:
Event Header

Filed 说明 长度(单位:字节)
timestamp 时间戳,表示该event的生成时间 4
type_code event类型 1
server_id 生成event的server_id 4
event_length event的大小 4
next_position 下一个event的位置 4
flags event flags 2

Event Data

Field Value 说明
gtid_flags
sid 占用16字节,比如:b0d850c2-dbd0-11e9-90c3-080027b8bded
gno 占用8字节,比如:b0d850c2-dbd0-11e9-90c3-080027b8bded:1,数字1就是gno
lt_type 占用1字节,打开逻辑并行复制时,lt_type值为2
last_committed 占用8字节,lt_type 为2时才会有该值
sequence_number 占用8字节,lt_type 为2时才会有该值
crc32校验码 4字节,是这个binlog event的crc32检验值

3.7. PREVIOUS_GTIDS_LOG_EVENT

说明:
开启GTID模式后,每个binlog开头都会有一个PREVIOUS_GTIDS_LOG_EVENT事件,记录了上一个binlog文件结束时执行到的gtid集合,如图:
Mysql binlog 结构基础篇
事件存储结构【扩展】:
Event Header

Filed 说明 长度(单位:字节)
timestamp 时间戳,表示该event的生成时间 4
type_code event类型 1
server_id 生成event的server_id 4
event_length event的大小 4
next_position 下一个event的位置 4
flags event flags 2

Event Data

Field Value 说明
sid数量 占用8个字节。比如:b0d850c2-dbd0-11e9-90c3-080027b8bded:1-123,c1132ab1-e9be-11e9-a9d7-fa163ec9e7c2:1-6224,有两个server_uuid,因此sid数量为2
sid 占用16字节,比如:b0d850c2-dbd0-11e9-90c3-080027b8bded
sid对应的gtid段的数量 占用8字节。比如:b0d850c2-dbd0-11e9-90c3-080027b8bded:1-123:150-158,看最后的数字1-123:150-158,有两段gtid值,所以sid对应的gtid段的数量为2
sid对应的gtid段的起始值 占用8字节,比如:1-123,起始值为1
sid对应的gtid段的结束值 占用8字节,比如:1-123,结束值为123
  若有多个段,依次解析
crc32校验码 4字节,是这个binlog event的crc32检验值

3.8. STOP_EVENT

说明:
当MySQL数据库停止时,会在当前的binlog末尾添加一个STOP_EVENT事件表示数据库停止。

4. 结尾

最后补充上传文章内容的思维导图,有兴趣的朋友可以下载,Mysql-binlog结构基础-思维导图


Mysql binlog 结构基础篇
上一篇:Docker 容器与宿主主机互传文件


下一篇:从JVM heap dump里查找没有关闭文件的引用