mysql 5.7.13 log_有关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 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)相关推荐
- mysql 刷新二进制日志_使用binlog日志恢复MySQL数据库删除数据的方法
binlog日志简介: binlog 就是binary log,二进制日志文件,这个文件记录了MySQL所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间. b ...
- centos7 mysql libssl_centos7.2安装mysql5.7.13及ssl主从复制
centos7.2安装mysql5.7.13 一.MySQL 5.7主要特性: 原生支持Systemd 更好的性能:对于多核CPU.固态硬盘.锁有着更好的优化 更好的InnoDB存储引擎 更为健壮的复 ...
- MySQL运维案例分析:Binlog中的时间戳
引言:本文从一个典型的案例入手来讲述Binlog中时间戳的原理和实践,通过本文你可以了解时间戳在Binlog中的作用及产生方法,以便在出现一些这方面怪异的问题时,做到心中有数,胸有成竹. 本文选自&l ...
- MySQL备份方案–(利用mysqldump以及binlog二进制日志)
MySQL备份方案-->(利用mysqldump以及binlog二进制日志) 随着数据不断增加,而且为了兼容以后的innodb存储引擎, 所以考虑采用mysqldump全备+日志增量备份的策略. ...
- centos6.7 64位环境下部署MySQL-5.7.13
系统环境: [root@localhost ~]# cat /etc/redhat-release CentOS release 6.7 (Final) [root@localhost tools]# ...
- 基于centos6的mysql5.7.13主从部署(一)
基于centos6的mysql5.7.13主从部署(一) 一.实验环境: 两台主机安装Centos6.7 32位操作系统: 两台Linux安装同一版本的MySQL,这里使用mysql5.7.13: m ...
- cmake 编译mysql_CentOS5.6下使用cmake编译MySQL5.5.13源码和安装
一.准备环境 1. 安装确保以下系统相关库文件 gcc gcc-c++ autoconf automake zlib* libxml* ncurses-devel libmcrypt* libt ...
- 使用cmake安装mysql5.5.13
安装cmake: tar zxvf cmake-2.8.4.tar.gz cd cmake-2.8.4 ./configure --prefix=/usr/local/cmake make & ...
- CentOS7.2.1511 安装Mysql-5.7.13
MySQL 5.7 GA版本的发布,也就是说从现在开始5.7已经可以在生产环境中使用,有任何问题官方都将立刻修复. MySQL 5.7主要特性: 更好的性能:对于多核CPU.固态硬盘.锁有着更好的优化 ...
最新文章
- Knockout应用开发指南 第六章:加载或保存JSON数据
- 太赞了!NumPy 手写所有主流 ML 模型,由普林斯顿博士后 David Bourgin打造的史上最强机器学习基石项目!...
- 美国科技三巨头的财报为何集体爆表?原因在这里
- java声明变量简单程序_零基础学编程之java变量
- 共享内存 Actor并发模型到底哪个快?
- 如何在Spring Boot应用程序中使用配置文件
- LeetCode 1806. 还原排列的最少操作步数(模拟)
- Ray.tune可视化调整超参数Tensorflow 2.0
- 互联网晚报 | 2月20日 星期日 | 天猫回应“改名转自营”;上汽奥迪正式进驻成都;谷爱凌在抖音开启直播首秀...
- 【2015年第4期】大数据引领教育未来:从成绩预测谈起
- java中方法未定义_java - Java SE中的未定义方法错误 - 堆栈内存溢出
- Java与完成端口IOCP
- 波特率 and 比特率,傻傻分不清楚
- MATLAB中四阶单位矩阵,matlab-线性代数 创建 N阶数量矩阵 N阶单位矩阵 对角矩阵 范德蒙矩阵 等差数列......
- Surface Pro 7 综合评测——购买感受和使用重点【品控、性能、投影】
- solidworks电气元件3d库_丨部件库丨西门子3RV6电机保护开关
- 做前端的:你有没有觉得很吃力?
- 2017-2018 ACM-ICPC, Asia Daejeon Regional Contest:Gym 101667B
- python远程聊天_python工具,微信聊天、自动回复、手机微信远程控制电脑
- 如何拿到阿里、华为、美团等6个大厂的顶级offer?
热门文章
- Linux “百变”秀:今天 Windows 95,明天 Mac OS 9
- 2022 年人工智能全球最具影响力学者榜单 AI 2000 正式发布
- 文字生成视频,只需一步
- 值得关注!2021音视频人才成长路线图发布了
- 程序员很少加班?得全栈开发者得天下?撕开标签的技术圈真实模样
- 阿里达摩院拿什么救人?
- A 股暴跌,户均亏 2 万!刚写好的辞职信又撕了……
- 物联网正在面临的 9 大安全挑战!
- 苹果首席设计官将离职;华为将从世界范围招揽天才少年;新版 Edge 更新 | 极客头条...
- 为什么程序员对旧代码深恶痛绝?