上次,我们仅仅把binlog做了一个概述,并没有去深入探索(1)binlog file究竟是怎么构成的?(2)binlog file的单元binlog events是怎么构成的?(3)我们能不能伪造出一个mysqlbinlog识别的binlog file? 当然,第三个问题看起来很cool,蛮有挑战性的。

这次我们讨论的是第4版本的binlogfile, 一般5.0.x以上的mysql使用该版本的binlogfile。

首先回答第一个问题

一、binlog file的构成

(1)binlog file的大致构成

这个问题其实之前也回答过,但是很不深入。这次,我会深度探索它,首先我们扒一扒官方的说法;

http://dev.mysql.com/doc/internals/en/binlog-file.html

这块就说了一句话:binlog file是由binlog file header和binlog events构成的,至于binlog file header其实就是0xfe62696e。换言之,binlog file先写了个0xfe62696e,然后后面跟着许多binlog event 。官方的文档还是很给力的,我们可以打开任意一个binlog file,以16进制形式打开,开头就是0xfe62696e。

(2)binlog events的组织方式

许多binlog event是否存在着自己的组织方式呢?答案是肯定的,跟在binlog file header后面的一般先是Binlog::FORMAT_DESCRIPTION_EVENT,这是第4版本的binlog event的开头,这个会在本文的"二、binlog events的构成"中详细提到。

紧接着一般是事务性的binlog events,要强调的是,在binlog file里所有的update, delete, insert语句都是存在于一组事务性的binlog event。

事务性的binlog events的格式如下(SQL代表任一SQL语句,当然一般只包含select,update, delete, insert语句,不包括ddl语句):

sql语句形式 statement格式   row格式
/ Anonymous_gtid_event     Anonymous_gtid_event    
BEGIN      Query_event(BEGIN)  Query_event(BEGIN) 
SQL Query_event(SQL)    Table_map_event & Rows_event      
SQL Query_event(SQL)     Table_map_event & Rows_event
...... ...... ......
COMMIT                      Xid_event   Xid_event 

至于mixed格式就是statement格式 和row格式交替出现,三种格式的不同也就在这个上面,至于上面看到的binlog events的格式,我们将在本文的"二、binlog events的构成"中详细提到。

最后会以STOP_EVENT或者ROTATE_EVENT结尾,这两个也会在本文的"二、binlog events的构成"中详细提到。

其他的一些binlog event不是特别重要,有兴趣的可以通过

http://dev.mysql.com/doc/internals/en/binlog-event.html去了解

二、binlog event的构成

(1)binlog event的构成

binlog event分为四部分:common header, post header, body以及footor,翻译能力有限,不知道怎么翻译,但是只要明白就好,common header和footor是共有的,而post header, body则是每个event都独有的。

common header 一般包含下面几个

名称 格式 描述
when 4字节整形 事件发生的时间,从1970年开始到现在的秒数
type_code 1字节整形 binglog event的类型
unmasked_server_id 4字节整形 服务器id
data_written 4字节整形 binglog event的长度,即common header的长度 + post header的长度 + body的长度+4
log_pos 4字节整形 下一个binglog event在文件中的位置
flags 2字节整形 binglog 的版本号

footor则包含一个crc32校验码,它的格式是4字节的整形。

(2)重要的binlog event的构成

1)FORMAT_DESCRIPTION_EVENT

参考自http://dev.mysql.com/doc/internals/en/format-description-event.html

body:

名称 格式 描述
binlog-version 2字节整形 binlog的版本,一般为4
mysql-server version 50字节字符串 mysql数据库的版本
create timestamp 4字节整形 创建时间
event header length 1字节整形 common header的长度,一般为19
event type header lengths EOF型字符串 各种binlog event的post header的长度

2)Xid_event

参考自http://dev.mysql.com/doc/internals/en/xid-event.html

body:

名称 格式 描述
XID 8字节整形 提交的事务id

3) Anonymous_gtid_event

没有可以参考的网站

post header:

名称 格式 描述
commit flag 1字节整形 是否提交,1代表提交,0代表没有提交
ENCODED SID 16字节整形 一般为0
ENCODED GNO 8字节整形 一般为0
TS_TYPE 1字节整形 一般为2

body:

名称 格式 描述
last_committed 8字节整形 上一次提交的序列号
sequence_number 8字节整形 本次的序列号

4)STOP_EVENT

参考自http://dev.mysql.com/doc/internals/en/stop-event.html

没有post header和body

5)ROTATE_EVENT

参考自http://dev.mysql.com/doc/internals/en/rotate-event.html

post header:

名称 格式 描述
position 8字节整形 下一个binlog event的位置

body:

名称 格式 描述
name of the next binlog 字符串 下一个binlog event所在的文件名

6)Table_map_event 

参考自http://dev.mysql.com/doc/internals/en/table-map-event.html

post header

名称 格式 描述
table id 4字节整形 表id,在mysql数据库中每个表都有一个唯一的id标识
flgas 2字节整形 当前保留,为以后使用

body:

名称 格式 描述
schema name length 1字节整形 数据库名长度
schema name NULL字符串 数据库名
table name length 1字节整形 表名长度
table name NULL字符串 表名
column-count 可变的整形 列数量
column-def 字符串 描述每列的数据类型
column-meta-def 字符串 描述每列的元数据
NULL-bitmask 字符串 描述每列的是不是可以为空

7)ROWS_EVENT

参考自http://dev.mysql.com/doc/internals/en/rows-event.html

post header

名称 格式 描述
table id 4字节整形 表id,在mysql数据库中每个表都有一个唯一的id标识
flgas 2字节整形 当前保留,为以后使用

body

名称 格式 描述
var_header_len 4字节整形 表的列数
columns_before_image 字符串 被使用列的比特值,例如,表有3列,只有第1列和第3列被使用,则该值为0xfa,只有第1列和第2列被使用,则该值为0xfc
columns_after_image 字符串 仅用于update命令,即更新后的情况是在这里获取的,delete和insert都没有该项
row 字符串

string.var_len nul-bitmap, length (bits set in 'columns-present-bitmap1'+7)/8
string.var_len value of each field as defined in table-map
这里的包含每一个行,每一行含有 nul-bitmap代表已使用的列是否为null,然后紧接着是数据value of each field as defined in table-map

8) QUERY_EVENT

参考自http://dev.mysql.com/doc/internals/en/query-event.html

post header

名称 格式 描述
slave_proxy_id 4字节整形 从机代理id
execution time 4字节整形 执行时间
schema length 1字节整形 数据库名长度
error-code 2字节整形 错误码
status-vars length 2字节整形 状态长度

body

名称 格式 描述
status-vars 字符串 执行sql语句的mysql的环境变量
schema NULL字符串 数据库名
query EOF字符串 SQL语句

三、伪造的binlog文件

现在通过上面的介绍,我们已经能伪造我们的binlog文件,只不过我们只能伪造statement格式下的binlog,因为row模式下的binlog是需要sql执行时的真实数据的。

四、补充:

1.INTVAR_EVENT

对于写入带有自增列的表时,binlog会在statement模式下增加一个事件,就是INTVAR_EVENT,他会规定插入的语句的自增列数,一般出现在BEGIN的Query_event之后,出现在普通的Query_event之前,mysqlbinlog会把它解析成"SET INSERT_ID = 自增id"语句后

我们可以看到他的格式如图所示

body

名称 格式 描述
type 1字节整形 代表INTVAR_EVENT的类型
value 8字节整形 自增id

关于type类型,我们已经确认的是在上述的情况中类型是INSERT_ID_EVENT,而其他两种类型INVALID_INT_EVENT和LAST_INSERT_ID_EVENT还没有出现过,为此这是待确认的事件,以后补充。

有关binlog的那点事(二)(mysql5.7.13)的更多相关文章

  1. 有关binlog的那点事(mysql5.7.13)

    binlog作为mysql中最重要的日志之一,能实现异常恢复以及主从复制. 我们主要讨论的是主从复制中的binlog,这里将以mysql5.7.13的源码为主要依据来分析binlog. 在主从复制中, ...

  2. 有关binlog的那点事(三)(mysql5.7.13)

    这次我们要探索更精细的binlog内容,上次讨论的Query_event和Rows_event肯定有让你疑惑不解的问题.Query_event中的status-vars环境变量有哪些,Rows_eve ...

  3. MySQL-5.6.13免安装版配置方法

    MySQL-5.6.13免安装版配置方法   1. 下载MySQL Community Server 5.6.13 2. 解压MySQL压缩包    将以下载的MySQL压缩包解压到自定义目录下,我的 ...

  4. linux安装MySQL5.7.13(二进制|源码)

    二进制和源码版本安装MySQL5.7.13,并简单介绍不同之处. 一.通用二进制部分 1.下载MySQL通用二进制软件包.[root@node1 ~]# wget http://120.52.72.2 ...

  5. Win10下Mysql5.7.13,解压版安装流程

    一.环境变量配置 1.将下载好的压宿包解压到安装目录,我的安装目录就是:D:\DevelopmentTool\Mysql5.7.13\mysql-5.7.13-winx64 2.鼠标选择计算机右键,点 ...

  6. mysql5.6.13通用二进制格式安装并使用amoeba实现对mysql5.6数据库读写分离

    proxy 192.168.8.39 master 192.168.8.40 slave 192.168.8.20 一.安装mysql-5.6.13服务器 安装包: mysql-5.6.13-linu ...

  7. Centos6.4_X64编译安装php-5.4.17、nginx-1.4.2、mysql-5.6.13

    安装参考: CentOS 6.3编译安装Nginx1.2.2+MySQL5.5.25a+PHP5.4.5 http://www.dedecms.com/knowledge/servers/linux- ...

  8. MySQL5.7.13源码编译安装指南

    系统 CenterOs 6.5 1.安装依赖包(cmake make gcc等,其实好多都有了,不需要更新,为了防止世界被破坏,就装下) yum install gcc gcc-c++ -yyum i ...

  9. MySQL5.7.13源码编译安装指南(转)

    系统 CenterOs 6.5 1.安装依赖包(cmake make gcc等,其实好多都有了,不需要更新,为了防止世界被破坏,就装下) yum install gcc gcc-c++ -yyum i ...

  10. 使用cmake安装mysql5.5.13

    MySQL从5.5版本开始,通过./configure进行编译配置方式已经被取消,取而代之的是cmake工具.因此,我们首先要在系统中源码编译安装cmake工具. 安装cmake : tar zxvf ...

随机推荐

  1. brew管理node的版本

    摘要 nvm可以.brew怎么去切换不同的node版本 转载请注明出处:http://my.oschina.net/uniquejava/blog/491030 brew详解:http://stack ...

  2. React,React Native中的es5和es6写法对照

    es6用在React中的写法总结: 在es6还没有完全支持到浏览器的阶段里,已经有很多技术人员开始用es6的写法来超前编程了,因为有转义es6语法的工具帮助下,大家才可大量使用.解析看看es6写法用在 ...

  3. 【转】《从入门到精通云服务器》第四讲—DDOS攻击

    上周咱们深入分析了云服务器的配置问题,好了,现在手上有了云服务器之后,我们又不得不提它:DDOS攻击.这是所有运维者的心头痛,也是任何公司听闻后都将心惊胆战的强大对手.下面我们将用浅显易懂的方式讲述什 ...

  4. linux安装oracle11g

    准备oracle安装文件 Oracle11gR2包含两个文件linux_11gR2_database_1of2.zip和linux_11gR2_database_2of2.zip,将这两个文件通过SS ...

  5. bzoj2342还是马拉车

    就好比第一次写主席树的时候写了30行,第二次写了5行 这次马拉车只剩下 ,id=,mx=;i<=n;i++) { -i],mx-i):;a[i-p[i]]==a[i+p[i]+];p[i]++) ...

  6. 【Telerik】弹出对话框RadWindow,确认删除信息

    要做一个删除功能,但是删除前正常都要弹出对话框确认一下是否删除信息,防止误删信息.

  7. CSS列表逆序

    要使列表逆序的话,大多数人包括我一半都会选择在ol标签里使用reversed属性 <ol reversed> <li>first</li> <li>se ...

  8. QComboBox的activated与currentIndexChanged的区别

    void activated ( int index ) void activated ( const QString & text ) 信号activated是只要单击选择框即使所选内容选择 ...

  9. 利用闭包实现多次ajax请求只执行最后一次

    点一个按钮,则向服务器请求资源,不作处理时,多次点击后会有很多个请求在等待.我们知道一般我们用ajax是异步请求,那么我们快速重复点击一个按钮得到的结果其实我们并不知道是哪次点击的结果可能是第一次可能 ...

  10. PHP去重算法的优化过程

    最近公司在做一个项目,需要对爬取到的数据进行去重,方法就是根据数据的id,去除掉id重复的数据. 下面是这个方法的演化过程. // 去重 $arr_id = array(); $LeTVFeedLis ...