前言
官方文档
https://dev.mysql.com/doc/internals/en/replication-protocol.html
但是文档似乎没有写全, 有些事件的定义找不到文档
binlog文件分析
以下是某个binlog文件的分析结果 (貌似都是小端字节序)
FE 62 69 6E // magic FE 'bin'
35 37 8F 5C // 事件创建的时间, 秒, 0x5C8F3735, 即2019/3/18 14:14:13
0F // event type, 15表示binlog描述事件
01 00 00 00 // server id, 01
78 00 00 00 // event size, 事件大小, 120字节. 包括header, post-header, body
7C 00 00 00 // 下一个事件的位置,
01 00 // flag, 即0x0001. LOG_EVENT_BINLOG_IN_USE_F,
// 如果当前文件正在被mysql使用, 则置成1, 否则, 置为0
04 00 // binlog-version, 0x0004,
38 2E 30 2E 31 35 00 // mysql-server版本, 50个字节, 本处为字符串"8.0.15"
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00
35 37 8F 5C // binlog创建时间
13 // Binlog Event Header的消息头大小, 固定值19
00 0D 00 08 00 00 00 00 04 00 04 00 00 00 60 00 // 以下三行是为各种类型的Header所对应的长度大小
04 1A 08 00 00 00 08 08 08 02 00 00 00 0A 0A 0A // 源代码中有40种type定义
2A 2A 00 12 34 00 0A
01 F7 B8 86 9B // 这一段不知道是什么东西, 可能是检验和之类的东西
35 37 8F 5C // 时间
23 //事件类型35, 表示PREVIOUS_GTIDS_LOG_EVENT
01 00 00 00
47 00 00 00 // 事件长度71字节
C3 00 00 00 // 下一个事件的位置
80 00 // flag
01 00 00 00 00 00 00 00 6F 16 6D 02 44 84 11 E9 //这段数据我也不知道怎么解析, 文档上没有. 估计得看源代码了
8A 8E 00 16 3E 10 05 86 01 00 00 00 00 00 00 00
01 00 00 00 00 00 00 00 09 00 00 00 00 00 00 00 BA
09 A9 48
AA 37 8F 5C // 时间
21 //事件类型33, 表示GTID_LOG_EVENT
01 00 00 00
4F 00 00 00
12 01 00 00
00 00
00 6F 16 6D 02 44 84 11 E9 8A
8E 00 16 3E 10 05 86 09 00 00 00 00 00 00 00 02
00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00
15 07 24 53 58 84 05 FC 11 01 8F 38 01 00 20 9E
37 7F
AA 37 8F 5C
02 //QUERY_EVENT
01 00 00 00
4B 00 00 00
5D 01 00 00
08 00
0B 00 00 00 // slave_proxy_id
00 00 00 00 // execution time
04 // schema length
00 00 // error-code
1D 00 //status-vars length, 29, 官网上似乎没写完整
00 00 00 00 00 01 20 00 A0 45 00 00 00 00
06 03 73 74 64 04 FF 00 FF 00 FF 00 12 FF 00
74 65 73 74 00 //schema, "test"
42 45 47 49 4E 4B 0E 6C //字符串 BEGIN K l, 不清楚这是什么语句.
A5 //估计是校验和
AA 37 8F 5C
13 //TABLE_MAP_EVENT, 官网上没写. 不知道这该如何定义
01 00 00 00
30 00 00 00
8D 01 00 00
00 00
45 00 00 00 00 00 01 00 04 74 65 73 74 00 02 74
31 00 01 03 00 01 01 01 00 DD 9F 06 84 AA 37 8F
5C 1E 01 00 00 00 28 00 00 00 B5 01 00 00 00 00
45 00 00 00 00 00 01 00 02 00 01 FF 00 09 00 00
00 A0 D7 5B 35
AA 37 8F 5C
10 // XID_EVENT
01 00 00 00
1F 00 00 00
D4 01 00 00
00 00
17 00 00 00 00 00 00 00
7F 0D 0C AF
mysqlbinlog主程序
mysql的mysqlbinlog可以使用binlog文件, 查看它的源码. 通过main函数一路追踪, 它处理本机的binlog文件时, 使用的以下代码
mysqlbinlog.cc
static Exit_status dump_local_log_entries(PRINT_EVENT_INFO *print_event_info,
const char *logname) {
Exit_status retval = OK_CONTINUE;
ulong max_event_size = 0;
mysql_get_option(NULL, MYSQL_OPT_MAX_ALLOWED_PACKET, &max_event_size);
Mysqlbinlog_file_reader mysqlbinlog_file_reader(opt_verify_binlog_checksum,
max_event_size);
Format_description_log_event