MySQL内部手册/二进制日志/二进制日志版本

20.8二进制日志版本

二进制日志文件格式有几个版本:

  • v1: MySQL 3.23版本

  • v3:在MySQL 4.0.2到4.1中使用

  • v4: MySQL 5.0及以上版本使用

v2格式被简单使用(在早期的MySQL 4.0中)。X版本),但它已经过时,不再受支持。

处理二进制日志的程序必须能够说明每种支持的二进制日志格式。本节描述服务器如何区分每种格式,以确定二进制日志文件使用哪种格式。Mysqlbinlog使用同样的原则。

重要的常量:

  • START_EVENT_V3= 1

  • FORMAT_DESCRIPTION_EVENT= 15

  • EVENT_TYPE_OFFSET= 4

  • EVENT_LEN_OFFSET= 9

  • ST_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)。