MySQL Binlog 文件格式解析(GTID_LOG_EVENT)

MySQL Binlog 由一个个的event组成,event有不同的种类,在MySQL 5.6版本加入gtid功能之后,每个事务都会有唯一的一个gtid序号与其对应,这个gtid序号在Binlog中也有一个专门的event类型与之对应,也就是GTID_LOG_EVENT,本文将详细描述GTID_LOG_EVENT的格式。

一、什么是GTID_LOG_EVENT?
插入一条记录,看下这个sql在binlog里由哪几个部分组成。
insert into tb values(1);
解析binlog,执行:show binlog events in ‘mysql-bin.000001’;
mysql> show binlog events in ‘mysql-bin.000001’;
+—————-+———–+————-+——————————————————————-+
| Event_type     | Server_id | End_log_pos | Info                                                              |
+—————-+———–+————-+——————————————————————-+
| Format_desc    |        10 |         123 | Server ver: 5.7.19-17-debug-log, Binlog ver: 4                    |
| Previous_gtids |        10 |         154 |                                                                   |
| Gtid                 |        10 |         219 | SET @@SESSION.GTID_NEXT= ‘b0d850c2-dbd0-11e9-90c3-080027b8bded:1’ |
| Query              |        10 |         290 | BEGIN                                                             |
| Table_map       |        10 |         334 | table_id: 389 (db1.tb)                                            |
| Write_rows      |        10 |         374 | table_id: 389 flags: STMT_END_F                                   |
| Xid                   |        10 |         405 | COMMIT /* xid=4632 */                                             |
+—————-+———–+————-+——————————————————————-+
7 rows in set (0.00 sec)
可以看到一条插入语句,在binlog中变成了多个event。Format_desc和Previous_gtids分别是格式描述和上一个binlog文件结束时的gtid序号,这里不详细描述。从Gtid这个event开始看:
  1. Gtid,SET @@SESSION.GTID_NEXT= ‘b0d850c2-dbd0-11e9-90c3-080027b8bded:1’
  2. Query,BEGIN,事务开始
  3. Table_map,这种类型的event描述了表的元信息,比如字段数量,字段类型,字段是否默认为空,字段是否变长等等
  4. Write_rows,记录insert的数据
  5. Xid,COMMIT,事务提交
一条简单的sql语句,在binlog中产生了5个event。其中第一个event Gtid 就是今天要详细介绍的event类型 GTID_LOG_EVENT。
二、GTID_LOG_EVENT结构解析
event header 结构解析:
  • 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个字节
GTID_LOG_EVENT 对应的type_code为 33。
event data结构解析:
  • gtid_flags,占用1个字节
  • sid,占用16字节,比如:b0d850c2-dbd0-11e9-90c3-080027b8bded,一共16字节
  • gno,占用8字节,比如:b0d850c2-dbd0-11e9-90c3-080027b8bded:1,数字1就是gno,占用8个字节
  • lt_type,占用1字节,打开逻辑并行复制时,lt_type值为2
  • last_committed,占用8字节,lt_type 为2时才会有该值
  • sequence_number,占用8字节,lt_type 为2时才会有该值
  • 最后4字节,是这个binlog event的crc32检验值
最后看一个完整的gtid event的二进制示例:
[root@host]# hexdump -C -s 154 -n 65 /data/mysql/data_5.7.19/mysql-bin.000001
0000009a  b0 b8 2a 5e 21 0a 00 00  00 41 00 00 00 db 00 00  |..*^!….A……|
000000aa  00 00 00 00 b0 d8 50 c2  db d0 11 e9 90 c3 08 00  |……P………|
000000ba  27 b8 bd ed 01 00 00 00  00 00 00 00 02 00 00 00  |’……………|
000000ca  00 00 00 00 00 01 00 00  00 00 00 00 00 e5 e8 5f  |……………_|
000000da  50

发表评论