深入理解MySQL主从原理
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.1.4 Event header和Event footer

这两部分在每个Event中都是一样的,大小和格式都是固定的。下面解释它们的含义。

1.Event header

timestamp:固定4字节,是从新纪元时间(1970年1月1日0时0分0秒)以来的秒数。这个时间是命令发起的时间。如何定义命令发起呢?它是语句开始执行的时间,源码可以是在dispatch_command函数的开头设置的(thd->set_time())。言外之意就是语法意义、权限检查、优化器生成执行计划的时间都包括在里面。还要注意这个时间在从库计算Seconds_Behind_Master的时候是一个重要的依据,这一点我们将在4.9节详细介绍。

type code:固定1字节,是Event的编码。每个Event都有自己的编码。

server_id:固定4字节,就是生成这个Event数据库的server_id。即便从库端开启了参数log_slave_updates,从库将主库的Event写到自己的binary log中,这个server_id也依然是主库的server_id,源码有如下设置:

如果这个Event再次传到主库,那么需要跳过,不会写入 relay log。源码可以在Log_event::do_shall_skip(由queue_event函数调入)函数中找到跳过逻辑,如下。

event_len:固定4字节,是整个Event的长度。

end_log_p:固定4字节,是下一个Event的开始位置。

flags:固定2字节,某些Event包含这个标识,比如Format_description_log_event中的LOG_EVENT_BINLOG_IN_USE_F标识说明本binary log是当前正在写入的。

2.Event footer

crc:固定4字节,这部分就是整个Event的crc校验码,用于标识Event的完整性。

如果要查看它们的完整定义可以参考源码的Log_event_header类和Log_event_footer类。实际上在源码中还将Event data部分更细致地分为header和body部分,对应了固定部分和可变部分,后面我们会看到。