上次,我们仅仅把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执行时的真实数据的。

mysql 5.7.13 log_有关binlog的那点事(二)(mysql5.7.13)相关推荐

  1. mysql 刷新二进制日志_使用binlog日志恢复MySQL数据库删除数据的方法

    binlog日志简介: binlog 就是binary log,二进制日志文件,这个文件记录了MySQL所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间. b ...

  2. centos7 mysql libssl_centos7.2安装mysql5.7.13及ssl主从复制

    centos7.2安装mysql5.7.13 一.MySQL 5.7主要特性: 原生支持Systemd 更好的性能:对于多核CPU.固态硬盘.锁有着更好的优化 更好的InnoDB存储引擎 更为健壮的复 ...

  3. MySQL运维案例分析:Binlog中的时间戳

    引言:本文从一个典型的案例入手来讲述Binlog中时间戳的原理和实践,通过本文你可以了解时间戳在Binlog中的作用及产生方法,以便在出现一些这方面怪异的问题时,做到心中有数,胸有成竹. 本文选自&l ...

  4. MySQL备份方案–(利用mysqldump以及binlog二进制日志)

    MySQL备份方案-->(利用mysqldump以及binlog二进制日志) 随着数据不断增加,而且为了兼容以后的innodb存储引擎, 所以考虑采用mysqldump全备+日志增量备份的策略. ...

  5. centos6.7 64位环境下部署MySQL-5.7.13

    系统环境: [root@localhost ~]# cat /etc/redhat-release CentOS release 6.7 (Final) [root@localhost tools]# ...

  6. 基于centos6的mysql5.7.13主从部署(一)

    基于centos6的mysql5.7.13主从部署(一) 一.实验环境: 两台主机安装Centos6.7 32位操作系统: 两台Linux安装同一版本的MySQL,这里使用mysql5.7.13: m ...

  7. cmake 编译mysql_CentOS5.6下使用cmake编译MySQL5.5.13源码和安装

    一.准备环境 1.    安装确保以下系统相关库文件 gcc gcc-c++ autoconf automake zlib* libxml* ncurses-devel libmcrypt* libt ...

  8. 使用cmake安装mysql5.5.13

    安装cmake: tar zxvf cmake-2.8.4.tar.gz cd cmake-2.8.4 ./configure  --prefix=/usr/local/cmake make & ...

  9. CentOS7.2.1511 安装Mysql-5.7.13

    MySQL 5.7 GA版本的发布,也就是说从现在开始5.7已经可以在生产环境中使用,有任何问题官方都将立刻修复. MySQL 5.7主要特性: 更好的性能:对于多核CPU.固态硬盘.锁有着更好的优化 ...

最新文章

  1. Knockout应用开发指南 第六章:加载或保存JSON数据
  2. 太赞了!NumPy 手写所有主流 ML 模型,由普林斯顿博士后 David Bourgin打造的史上最强机器学习基石项目!...
  3. 美国科技三巨头的财报为何集体爆表?原因在这里
  4. java声明变量简单程序_零基础学编程之java变量
  5. 共享内存 Actor并发模型到底哪个快?
  6. 如何在Spring Boot应用程序中使用配置文件
  7. LeetCode 1806. 还原排列的最少操作步数(模拟)
  8. Ray.tune可视化调整超参数Tensorflow 2.0
  9. 互联网晚报 | 2月20日 星期日 | 天猫回应“改名转自营”;上汽奥迪正式进驻成都;谷爱凌在抖音开启直播首秀...
  10. 【2015年第4期】大数据引领教育未来:从成绩预测谈起
  11. java中方法未定义_java - Java SE中的未定义方法错误 - 堆栈内存溢出
  12. Java与完成端口IOCP
  13. 波特率 and 比特率,傻傻分不清楚
  14. MATLAB中四阶单位矩阵,matlab-线性代数 创建 N阶数量矩阵 N阶单位矩阵 对角矩阵 范德蒙矩阵 等差数列......
  15. Surface Pro 7 综合评测——购买感受和使用重点【品控、性能、投影】
  16. solidworks电气元件3d库_丨部件库丨西门子3RV6电机保护开关
  17. 做前端的:你有没有觉得很吃力?
  18. 2017-2018 ACM-ICPC, Asia Daejeon Regional Contest:Gym 101667B
  19. python远程聊天_python工具,微信聊天、自动回复、手机微信远程控制电脑
  20. 如何拿到阿里、华为、美团等6个大厂的顶级offer?

热门文章

  1. Linux “百变”秀:今天 Windows 95,明天 Mac OS 9
  2. 2022 年人工智能全球最具影响力学者榜单 AI 2000 正式发布
  3. 文字生成视频,只需一步
  4. 值得关注!2021音视频人才成长路线图发布了
  5. 程序员很少加班?得全栈开发者得天下?撕开标签的技术圈真实模样
  6. 阿里达摩院拿什么救人?
  7. A 股暴跌,户均亏 2 万!刚写好的辞职信又撕了……
  8. 物联网正在面临的 9 大安全挑战!
  9. 苹果首席设计官将离职;华为将从世界范围招揽天才少年;新版 Edge 更新 | 极客头条...
  10. 为什么程序员对旧代码深恶痛绝?