Mysql 主从复制-Binlog详细解析(Row格式)

来源:互联网 发布:云烟软件 编辑:程序博客网 时间:2024/04/29 22:19

Mysql 主从复制过程中,数据交换主要是依托于mysql的Binlog,本文将对mysql的binlog进行详细的解析,从二进制来分析binlog的语义。

binlog又分为3中,statement格式,row格式,mixed格式。

statement 格式就是把所有数据变化的sql记录下来,但是如果出现now() rand()等函数时,会造成主从不一致的情况。

mixed格式是将row和statement结合起来,DML用row,DDL用statement。

row格式是比较复杂的,下面会详细介绍。

首先,我们先来做个测试,执行以下sql语句。

我们做了对于一个空的数据库做了6个操作,其中,1和2为DDL,row格式不记录。6为查询语句,row格式也不记录。重点分析中间的3条。


背景:

    Mysql binlog 采用小端存储,fe 62 69 6a 应解析为 6a6962fe。


Mysql binlog的开头。

在binlog中,所有改变都被记录为event,每个event的前19个Byte为头。头的解析规则为:

  • fe 62 69 6e : 所有binlog的统一的头
  • a6 77 0b 56 :1443592102 seconds from Linux epoch  #从1970年1月1日起到日志记录时的秒数
  • 0f          : type #日志类型
  • 01 00 00 00 : server-id #mysql配置的server-id
  • 67 00 00 00 : Length103 #该event的数据长度
  • 6b 00 00 00 : Next Event Start Pos107 #下个event的其实位置
  • 01 00       : Flag #标志位
  • 04 00       : Binlog-version # mysql-binlog的版本
  • 50个字节    : mysql-server version #mysql的版本
  • a6 77 0b 56 : 1443592102 #时间戳

每个跟数据相关的event都会对应一个table_map event,table_map event的解析方式为:

Table_map event的头和前面的分析方法一样,除去头,Table_map event 为:

  • 29 00 00 00 00 00  :tablenumber #表的编号
  • 0100       : flag #标志位
  • 06          : DBnamelength #数据库名字的长度,后面紧跟着数据库的名字,最后是一个 00 的分隔符
  • 06          : Tablenamelength#数据库表名字的长度,后面紧跟着数据库表的名字,最后是一个 00 的分隔符
  • 03          : Column number #数据库表的列的数量
  • 03 0f 0f   : Typeof column(03 MYSQL_TYPE_LONG) 数据库表中列的类型

                                                          (0f MYSQL_TYPE_VARCHAR)

  • 04          : metadata length #数据库表列的元数据长度
  • ff 00      : 255 varchar length #varchar类型的字段长度为255
  • 07          : checksum #校验位

insert,delete,update分别为有自己的格式,其中最复杂的是update,因为其记录了变化之前的数据和变化以后的数据,下面以update的例:

update操作的头同样和前面的相同,这里就不再分析了,略过头后,二进制表达的意义为:

  • 29 00 00 00 00 00 :tablenumber #要update的表编号
  • 01 00       : flag #标志位
  • 03          : Column number #列的数量
  • ff ff      : Addition #附加位
  • f8          : int startpos #int类型起始标志位
  • 01 00 00 00 : id = 1
  • 08          : length #下面varchar的长度,后面紧跟着数据

有需求或是什么不懂得地方,欢迎交流。












1 0
原创粉丝点击