有关binlog的那点事(二)(mysql5.7.13)
上次,我们仅仅把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 |
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)的更多相关文章
- 有关binlog的那点事(mysql5.7.13)
binlog作为mysql中最重要的日志之一,能实现异常恢复以及主从复制. 我们主要讨论的是主从复制中的binlog,这里将以mysql5.7.13的源码为主要依据来分析binlog. 在主从复制中, ...
- 有关binlog的那点事(三)(mysql5.7.13)
这次我们要探索更精细的binlog内容,上次讨论的Query_event和Rows_event肯定有让你疑惑不解的问题.Query_event中的status-vars环境变量有哪些,Rows_eve ...
- MySQL-5.6.13免安装版配置方法
MySQL-5.6.13免安装版配置方法 1. 下载MySQL Community Server 5.6.13 2. 解压MySQL压缩包 将以下载的MySQL压缩包解压到自定义目录下,我的 ...
- linux安装MySQL5.7.13(二进制|源码)
二进制和源码版本安装MySQL5.7.13,并简单介绍不同之处. 一.通用二进制部分 1.下载MySQL通用二进制软件包.[root@node1 ~]# wget http://120.52.72.2 ...
- Win10下Mysql5.7.13,解压版安装流程
一.环境变量配置 1.将下载好的压宿包解压到安装目录,我的安装目录就是:D:\DevelopmentTool\Mysql5.7.13\mysql-5.7.13-winx64 2.鼠标选择计算机右键,点 ...
- 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 ...
- 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- ...
- MySQL5.7.13源码编译安装指南
系统 CenterOs 6.5 1.安装依赖包(cmake make gcc等,其实好多都有了,不需要更新,为了防止世界被破坏,就装下) yum install gcc gcc-c++ -yyum i ...
- MySQL5.7.13源码编译安装指南(转)
系统 CenterOs 6.5 1.安装依赖包(cmake make gcc等,其实好多都有了,不需要更新,为了防止世界被破坏,就装下) yum install gcc gcc-c++ -yyum i ...
- 使用cmake安装mysql5.5.13
MySQL从5.5版本开始,通过./configure进行编译配置方式已经被取消,取而代之的是cmake工具.因此,我们首先要在系统中源码编译安装cmake工具. 安装cmake : tar zxvf ...
随机推荐
- 【C++设计模式】单件类与DCLP(Double Check Lock Pattern)的风险
[单件类] 保证只能有一个实例化对象,并提供全局的访问入口. [设计注意事项] 1.阻止所有实例化的方法: private 修饰构造函数,赋值构造函数,赋值拷贝函数. 2.定义单实例化对象的方法: a ...
- 2016-2017 ACM-ICPC Northwestern European Regional Programming Contest (NWERC 2016)
A. Arranging Hat $f[i][j]$表示保证前$i$个数字有序,修改了$j$次时第$i$个数字的最小值. 时间复杂度$O(n^3m)$. #include <bits/stdc+ ...
- [ACM训练] 算法初级 之 搜索算法 之 深度优先算法DFS (POJ 2251+2488+3083+3009+1321)
对于深度优先算法,第一个直观的想法是只要是要求输出最短情况的详细步骤的题目基本上都要使用深度优先来解决.比较常见的题目类型比如寻路等,可以结合相关的经典算法进行分析. 常用步骤: 第一道题目:Dung ...
- Oracle OEM
一.OEM是什么 Oracle Enterprise Manager(Oracle企业治理器,简称OEM)是通过一组Oracle程序,为治理分布式环境提供了治理服务. 二.配置OEM 三.启动OEM ...
- 【ORACLE】IN 后跟&参数字符串的处理方法
今天写尼日利亚BOSS,数据修复脚本时遇到一个问题, 参数字符串无法再IN中使用,例如:想要完成下面的查询 select * From customeren c where c.customercod ...
- block和代理小结
代理使用原则: 代理方法的参数是要传的值,代理方法的返回值是要得到的值(即要调用的类回传的值),并且在实现的代理方法中的值就是原来的类要传的值(设置delegate=self), 比如2个类 A,B ...
- 如何让{dede:channel}有子栏目显示子栏目,无子栏目不显示同级栏目
我们在使用织梦系统制作网站时经常会遇到网站栏目较多,显示当前栏目下的二级与三级栏目时,使用栏目嵌套标签,但是当三级栏目为空时,会显示同级栏目.从用户体验角度出发,常理情况下也是需要空白的,即二级栏目下 ...
- Linux下Nano命令使用指南
1.什么时候用nano? 一般网络很卡,ssh时一用vim/vi 就死窗口,或者死机的情况 2.如何使用? 打开或新建文件 #nano 文件名 禁用自动换行 #nano -w /etc/fs ...
- Linux OpenVPN 服务端吊销(revoke)客户端证书
(转自:https://www.xiaohui.com/dev/server/20070904-revoke-openvpn-client.htm) OpenVPN 服务器与 VPN 客户端之间的身份 ...
- 【Telerik】弹出对话框RadWindow,确认删除信息
要做一个删除功能,但是删除前正常都要弹出对话框确认一下是否删除信息,防止误删信息.