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