COM_BINLOG_DUMP_GTID 报文分析

备机向主机发起拉取binlog的命令( 主备开启gtid 模式)

官方定义:
http://dev.mysql.com/doc/internals/en/com-binlog-dump-gtid.html

If the binlog-filename is empty, the server will send the binlog-stream of the first known binlog.

COM_BINLOG_DUMP_GTID:
request the Binlog Network Stream based on a GTID

Payload
1              [1e] COM_BINLOG_DUMP_GTID
2              flags
4              server-id
4              binlog-filename-len
string[len]    binlog-filename
8              binlog-pos
  if flags & BINLOG_THROUGH_GTID {
4              data-size
string[len]    data
  }
Fields
flags (2) --

Flag

Description

0x01

BINLOG_DUMP_NON_BLOCK

0x02

BINLOG_THROUGH_POSITION

0x04

BINLOG_THROUGH_GTID

server_id (4) -- server id of this slave

binlog-filename-len (4) -- length of binlog-filename

binlog-filename (string.fix_len) -- filename of the binlog on the master

binlog_pos (8) -- position in the binlog-file to start the stream with

data-len (4) -- length of data

data (string.fix_len) -- SID block

4                n_sids
  for n_sids {
string[16]       SID
8                n_intervals
    for n_intervals {
8                start (signed)
8                end (signed)
    }
  }
Returns
a Binlog Network Stream, a ERR_Packet or if BINLOG_DUMP_NON_BLOCK is set a EOF_Packet



 注意这里官方定义里面有一处严重的错误 n_sids 是8个字节 (siddon有篇复制协议分析文章: 深入解析MySQL replication协议 也指出了这个问题) 
  
抓包分析该命令,抓包前备机的位置:
           Retrieved_Gtid_Set: a572d2ec-68f1-11e6-9c0b-38eaa713ab5c:1-2,
f467597b-68e8-11e6-b6d0-38eaa713ab5c:1-2
            Executed_Gtid_Set: a572d2ec-68f1-11e6-9c0b-38eaa713ab5c:1,
f467597b-68e8-11e6-b6d0-38eaa713ab5c:1-2

备机start slave IO_thread; 后抓包结果分析:
00:00:                                    flags
96:89:3f:01:                              server-id
0d:00:00:00:                              binlog-filename-len
00:00:00:00:00:00:00:00:00:00:00:00:00:   binlog-filename
04:00:00:00:00:00:00:00:                  binlog-pos

58:00:00:00:                              data-size

#data
02:00:00:00:00:00:00:00: n_sids
a5:72:d2:ec:68:f1:11:e6:9c:0b:38:ea:a7:13:ab:5c: SID1
01:00:00:00:00:00:00:00: gtid-set-index
01:00:00:00:00:00:00:00: begin
03:00:00:00:00:00:00:00: end

f4:67:59:7b:68:e8:11:e6:b6:d0:38:ea:a7:13:ab:5c: SID2
01:00:00:00:00:00:00:00: gtid-set-index
01:00:00:00:00:00:00:00: begin
03:00:00:00:00:00:00:00  end


a5:72:d2:ec:68:f1:11:e6:9c:0b:38:ea:a7:13:ab:5c [1,3)
f4:67:59:7b:68:e8:11:e6:b6:d0:38:ea:a7:13:ab:5c[1,3)

结论:
1.slave 发送给master时参考的位置是Retrieved_Gtid_Set,而不是Executed_Gtid_Set
2. slave 发送给master时的gtid-set 集合是 左闭右开的 
3.官方文档中n_sids的长度是错误的,是8个字节

 
  








你可能感兴趣的:(mysql/oracle)