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开始看:
- Gtid,SET @@SESSION.GTID_NEXT= 'b0d850c2-dbd0-11e9-90c3-080027b8bded:1'
- Query,BEGIN,事务开始
- Table_map,这种类型的event描述了表的元信息,比如字段数量,字段类型,字段是否默认为空,字段是否变长等等
- Write_rows,记录insert的数据
- 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
文章评论