二进制日志文件格式有几个版本:
v1: MySQL 3.23版本
v3:在MySQL 4.0.2到4.1中使用
v4: MySQL 5.0及以上版本使用
v2格式被简单使用(在早期的MySQL 4.0中)。X版本),但它已经过时,不再受支持。
处理二进制日志的程序必须能够说明每种支持的二进制日志格式。本节描述服务器如何区分每种格式,以确定二进制日志文件使用哪种格式。Mysqlbinlog使用同样的原则。
重要的常量:
START_EVENT_V3
= 1FORMAT_DESCRIPTION_EVENT
= 15EVENT_TYPE_OFFSET
= 4EVENT_LEN_OFFSET
= 9ST_SERVER_VER_LEN
= 50
二进制日志文件以一个4字节的魔术数开始,后面跟着一个标识文件格式的初始描述符事件。
在v1和v3中,这个事件被称为“开始事件”。
在v4中,它被称为“格式描述事件”。
在其他地方,您可能会看到这两个术语通用地统称这两种类型的事件。本讨论使用“描述符事件”作为集合术语。
每个二进制日志格式版本的描述符事件的头部和数据部分如下所示。这些图使用与前面描述的相同的约定事件结构.
v1开始活动(size = 69字节):
+=====================================+ | 事件|时间戳0:4 | |头 +----------------------------+ | | type_code 4: 1 | = START_EVENT_V3 = 1 | +----------------------------+ | | server_id 5: 4 | | +----------------------------+ | | event_length 9: 4 | = 69 +=====================================+ | 事件| binlog_version 13: 2 | = 1 |数据 +----------------------------+ | | server_version 15: 50 | | +----------------------------+ | | create_timestamp 65:4 | +=====================================+
v3开始活动(size = 75字节):
+=====================================+ | 事件|时间戳0:4 | |头 +----------------------------+ | | type_code 4: 1 | = START_EVENT_V3 = 1 | +----------------------------+ | | server_id 5: 4 | | +----------------------------+ | | event_length 9: 4 | = 75 | +----------------------------+ | | next_position 13: 4 | | +----------------------------+ | | 旗帜17:2 | +=====================================+ | 事件| binlog_version 19:2 | = 3 |数据 +----------------------------+ | | server_version 21: 50 | | +----------------------------+ | | create_timestamp 71: 4 | +=====================================+
V4格式描述事件(大小≥91字节;大小为76 +事件类型的数量):
+=====================================+ | 事件|时间戳0:4 | |头 +----------------------------+ | | type_code 4: 1 | = FORMAT_DESCRIPTION_EVENT = 15 | +----------------------------+ | | server_id 5: 4 | | +----------------------------+ | | event_length 9: 4 | > = 91 | +----------------------------+ | | next_position 13: 4 | | +----------------------------+ | | 旗帜17:2 | +=====================================+ | 事件| binlog_version 19:2 | = 4 |数据 +----------------------------+ | | server_version 21: 50 | | +----------------------------+ | | create_timestamp 71: 4 | | +----------------------------+ | | header_length 75: 1 | | +----------------------------+ | | post-header 76: n | = n个字节的数组,一个字节/事件| | |类型长度为所有服务器知道| |事件类型 | +=====================================+
在所有二进制日志版本中,描述符事件的事件数据都以一组公共字段开始
binlog_version
二进制日志版本号(1、3或4)。
server_version
服务器版本为字符串。
create_timestamp
创建时间戳,如果非零,则是该事件被创建的时间(以秒为单位);表示二进制日志产生的时间。这个字段实际上没有值:如果非零,它就是冗余的,因为它的值与头时间戳中的值相同。
注意:在实践中,创建时间戳字段应该被认为是为将来使用保留的,程序不应该依赖于它的值。这片土地将来可能被征用以服务于其他目的。
v4格式描述符事件数据包含两个附加字段,用于解释其他类型的事件:
header_length
事件头的长度。该值包括extra_headers
字段,因此这个头文件长度- 19生成extra_headers
字段。
当前在v4中,头长度(偏移量75)是19,这意味着在其他事件中,不会有额外的头跟随旗帜
字段。的其他事件中,如果将来报头长度为x > 19的某个值,则x-19个额外的报头字节数将出现在extra_headers
场后,旗帜
字段。
注意:的FORMAT_DESCRIPTION_EVENT
本身不包含extra_headers
字段。假设FDE有一个header_length
场后,旗帜
字段。这就会产生这样的问题:
x的值在
header_length
字段,该字段出现的位置晚于extra_headers
字段。在知道x的值之前,您无法知道的精确偏移量
header_length
字段。
换句话说,你需要知道x来求header_length
字段,但您无法知道x,除非您阅读header_length
字段。(循环依赖。)这意味着FDE提供的事件可扩展性机制不适用于FDE本身,因此FDE本身是不可扩展的。
post-header长度
每个事件的固定数据部分的长度。这是一个数组,为开始的所有事件提供后标头长度START_EVENT_V3
(类型代码1)UNKNOWN_EVENT
(类型代码0)。