网站建设知识
MySQL协议分析(结合PyMySQL)
2025-07-22 10:02  点击:0

MySQL协议分析(结合PyMySQL)

MySQL Packets

当MySQL客户端或者服务端发送数据时,它会首先把数据分割成(2^24-1)bytes的包,然后给每个包加上packet header。

类型名称描述
int<3>payload_length负载长度,除了header的4字节
int<1>sequence_id序列ID
stringpayload实际负载

* 当数据大于16M时,payload_length设为 2^24?1 (ff ff ff)
* 序列ID在0~255循环,在新命令开始的时候重置为0

PyMySQL相关代码:

        buff = b''        while True:            packet_header = self._read_bytes(4)            if DEBUG: dump_packet(packet_header)            btrl, btrh, packet_number = struct.unpack('ntinue="" d="" debug:="" dev.mysql="" doc="" en="" expected="" got="" https:="" if="" internals="" max_packet_len:="" number="" packet="" packet_number="" pre="" raise="" recv_data="self._read_bytes(bytes_to_read)" self._next_seq_id="(self._next_seq_id" sending-more-than-16mbyte.html="" sequence="" wrong="">

Replication协议

Binlog网络流客户端首先发送一个COM_BINLOG_DUMP类型的包,如成功,Server响应返回Binlog网络流。

包负载如下表:

1COM_BINLOG_DUMP(0x12)Binlog DUMP请求