20.8.1确定二进制日志版本

给定任何二进制日志文件,本节中的信息介绍如何确定写入的格式。

关于描述符事件格式的一些重要点:

  • V1标题字段对所有格式都是通用的。(v3和v4标题以V1标题字段开头,并添加next_position.旗帜字段。)

  • V3和V4标头包含相同的字段。V3和V4的数据部分不同,使得V4数据部分能够扩展到格式,而无需修改报头。

  • 只需读取两者即可确定二进制日志版本binlog_version.与V3 / V4相比,这些字节是不是本事实,因为与V3 / V4(第13位与19)相比,这些字节在V1中发生不同的位置。因此,有必要确定文件中的第一个事件是否表示V1格式启动事件。

要确定二进制日志文件的版本,请使用以下步骤:

1)文件以4字节的魔术号开始。跳过该文件中的第一个事件(在大多数情况下是一个开始事件或格式说明事件)。

2)从第一个事件中,阅读两个值:

  • 1字节类型代码处于位置event_type_offset.(4)在活动中。

  • 位置的4字节事件长度event_len_offset.(9)在活动中。

3)如果类型代码不是start_event_v3.或者format_description_event.,文件格式为v3。(参见本节后面的特殊条件1。)

4)如果类型代码是start_event_v3.(1),检查事件长度。如果长度小于75,则文件格式为v1,否则v3。为什么价值75?因为这是V3开始事件的长度:

  • 标题(19字节)

  • Binlog版本(2个字节)

  • 服务器版本(st_server_ver_len.= 50字节)

  • 时间戳(4字节)

总结这些长度产生19 + 2 + 50 + 4 = 75

因此,如果事件短于75个字节,则它必须来自V1文件,因为这将具有比V3文件更短的第一个事件。

5)如果类型代码是format_description_event.(15),文件格式为v4。

前面的步骤描述了一般二进制日志格式识别原则。但是,必须考虑一些特殊条件:

特殊条件1:在MySQL 4.0和4.1中,二进制日志文件中的初始事件可能不是一个启动事件。出现这种情况,因为服务器仅将启动事件写入启动后它创建的第一个二进制日志文件。对于后续文件,服务器写入类型的事件Rotate_Event.到当前日志文件的末尾,关闭它,并且开始下一个文件而不向其写一个启动事件。如果日志文件以不是未知的事件开头start_event_v3.或者format_description_event.,可以假设是V3文件,因为此行为仅发生在MySQL 4.0和4.1中,并且这些版本中的所有服务器都使用V3格式。

特殊条件2:在MySQL 5.1和5.2中,几个早期版本使用V4格式写入二进制日志文件,但使用不同的事件编号从V4中使用的那些。因此,当读取和发现FDE是v4时,还需要读取服务器版本,这是一个在第21页发生的字符串。如果该版本是受影响版本集中的一个,则发生事件重新计数这样从文件读取的事件映射到当前V4事件编号。