解析MYSQL BINLOG二进制格式(1)——准备工作

  原创:转载请说明出处谢谢!
  
  参考源:
  1、源码log_event。h log_event。cc包。c
  2,internals-en。epub
  
  
  一、目的
  ,,本系列文件主要为了说明
  1,为什么说行格式较声明更占空间
  2,为什么说行格式的binlog更加安全
  3、插入/更新/删除是生成的行binlog如何直接看懂二进制格式
  4、DDL生成的binlog是怎么样的
  5、插入选择/创建表如何生成的行binlog
  
  二、使用版本和数字显示
  本系列文章重要解释MYSQL 5.6后行格式的binlog格式以及和事物有关的事件,按照官方的说法
  binlog的格式经历了几个阶段
  “v1: mysql 3.23
  v3: mysql 4.0.2到4.1
  v4: mysql 5.0以上
  v2版本只是短暂的存在过,当然我们要解析当然是v4版本的binlog
  因为要看是5.6以上的binlog
  关于多字节的数字显示,一般使用低位优先模式,做到和操作系统无关,除非刻意说明
  关于低位优先参考:
  http://blog.itpub.net/7728585/viewspace-2124159/
  三,binlog的魔法数
  关于MYSQL BINLOG的作用就不做过多的解析了,在BINLOG中存储的是一种称之为事件的条目,
  它们以二进制的格式存储,平时我们使用的mysqlbinlog工具也就是对这种二进制格式的文件
  进行解析,得到直观的输出。这里不用mysqlbinlog而改为直接看二进制文件,当然我会对比
  MYSQLBINLOG的输出和二进制解析的过程
  每一个binlog文件都有4个字节的魔法数,其值固定为
  [root@testmy mysqld。1)# hexdump简历test.000005 
  可以看到
  铁62 69 6 e。斌
  
  四、binlog事件的总体构架
  一个事件包括了
  事件标题
  事件数据
  其事件数据中又分为
  固定的数据(贴头)
  可变数据
  
  事件标题:全部的活动统一固定的格式
  固定的数据(贴头):每一事件类固定
  变量数据:就是可以变化实际值了
  
  关于事件的类型比较多详细参考末尾源码的截取
  
  五、本系列文章要讨论的事件
  而这里我们只要讨论5.6,5.7中和行binlog格式和innodb
  联系比较紧密的几种事件如下:
  query_log_event/QUERY_EVENT typecode=02
  Format_description_log_event/FORMAT_DESCRIPTION_EVENT, typecode=15
  Xid_log_event/XID_EVENT, typecode=16
  Table_map_log_event/TABLE_MAP_EVENT typecode=19
  Write_rows_log_event/WRITE_ROW_EVENT typecode=30
  Update_rows_log_event/UPDATE_ROW_EVENT typecode=31日,
  Delele_rows_log_event/DELETE_ROW_EVENT typecode=32,
  
  因为这些语句是一个事物必须经历的,而Format_description_log_event是一个最重要的
  说明性的事件
  
  六、通用头文件(事件标题)解析
  下面先解释一下通用的19个字节。
  每一个事件有一个固定的头信息叫做事件标题:
  事件标题
  时间戳,,,0:4大敌;,,,,,,
  type_code,,,,4:1
  server_id,,,,彼前才能
  event_length,,9:4
  next_position,,十三4
  国旗,,,,,,,第二节,才能,,,,,,
  
  
  时间戳:固定4字节展示是新纪元(时代时间)以来的秒数
  type_code:固定1字节事件事件的编码,在源码中是一个枚举类型负载最后源码处
  server_id:固定4字节就是显示变量如“% server_id”;出来的值
  event_length:固定4字节整个事件的长度,包含固定和非固定长度
  next_position:固定4字节下一个事件的开始位置(2 ^ 32为4 g)
  国旗:固定2字
节事件标志   ,,,LOG_EVENT_BINLOG_IN_USE_F,0 x1这个旗帜表示是否binlog正确的关闭了,这个标示只出现在Format_description_log_event中
  ,,,LOG_EVENT_THREAD_SPECIFIC_F 0 x4是否查询基于了临时表,如果基于了临时表MYSQLBINLOG必须设置@@PSEUDO_THREAD_ID=xx
  ,,,LOG_EVENT_SUPPRESS_USE_F,,0×8和——binlog-do-db, replicated-do-db有关
  ,,,其他还有很多
  ,,,LOG_EVENT_ARTIFICIAL_F 0 x20 LOG_EVENT_RELAY_LOG_F 0 x40 LOG_EVENT_IGNORABLE_F 0 x80 LOG_EVENT_NO_FILTER_F 0 x100…
  ,,,可以自行参考log_event。h源码头文件中的详细解释
  ,,,,
  七、包装
浮点数值用   在binlog中部分数字使用这种方式显示,在后面的解析中会提到

解析MYSQL BINLOG二进制格式(1)——准备工作