关于binlog的这点事

上次,我们唯有把binlog做了二个概述,并未去深远商量(壹)binlog
file究竟是怎么构成的?(二)binlog file的单元binlog
events是怎么构成的?(3)大家能还是不能伪造出四个mysqlbinlog识别的binlog
file? 当然,第二个难点看起来很cool,蛮有挑战性的。

上次,大家一味把binlog做了三个概述,并未去深远探求(一)binlog
file毕竟是怎么构成的?(二)binlog file的单元binlog
events是怎么构成的?(3)大家能还是不可能伪造出四个mysqlbinlog识其余binlog
file? 当然,第多少个难题看起来很cool,蛮有挑衅性的。

至于binlog的那一点事(2)(mysql伍.7.一3),binlogmysql5.七.一三

上次,大家1味把binlog做了三个概述,并从未去深切探究(一)binlog
file毕竟是怎么构成的?(二)binlog file的单元binlog
events是怎么构成的?(三)我们能否伪造出三个mysqlbinlog识其他binlog
file? 当然,第多少个难点看起来很cool,蛮有挑衅性的。

本次我们谈论的是第伍版本的binlogfile,
1般伍.0.x以上的mysql使用该版本的binlogfile。

先是应对第3个难题

一、binlog file的构成

(1)binlog file的光景构成

其一题目实际上前边也答应过,可是很不深刻。此次,笔者会深度搜求它,首先大家扒一扒官方的说法;

那块就说了一句话:binlog file是由binlog file header和binlog
events构成的,至于binlog file header其实正是0xfe626玖陆e。换言之,binlog
file先写了个0xfe626玖陆e,然后前面随着大多binlog event
。官方的文书档案依旧很给力的,大家能够张开任意1个binlog
file,以1陆进制方式展开,初步正是0xfe626玖陆e。

(二)binlog events的公司措施

许多binlog event是还是不是留存着自身的协会章程吧?答案是自然的,跟在binlog
file
header前边的壹般先是Binlog::FORMAT_DESCRIPTION_EVENT,那是第4版本的binlog
event的发端,那一个会在本文的”2、binlog events的整合”中详尽提到。

继之一般是事务性的binlog events,要重申的是,在binlog
file里全部的update, delete, insert语句都以存在于一组事务性的binlog
event。

*事务性的binlog
events的格式如下(
SQL代表任一SQL语句,当然1般只包涵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 

 

 

 

 

 

至于关于binlog的这点事。mixed格式就是statement格式
row格式**轮换出现,二种格式的不等也就在那几个方面,至于上边看到的binlog
events的格式,大家就要本文的”贰、binlog events的组合”中详细提到。

终极会以STOP_EVENT或者ROTATE_EVENT末段,那多个也会在本文的”二、binlog
events的重组”中详细提到。

任何的壹对binlog event不是特意首要性,有意思味的能够由此

 二、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则带有3个crc3二校验码,它的格式是4字节的整形。

(2)重要的binlog event的构成

1)FORMAT_DESCRIPTION_EVENT

参考自

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

参考自

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

参考自

没有post header和body

5)ROTATE_EVENT

参考自

post header:

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

 

 

body:

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

 

 

6)Table_map_event 

参考自

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

参考自

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

参考自

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试行时的实事求是数据的。

上次,我们唯有把binlog做了二个概述,并从未去深远探求(一)binlog
file究竟是怎么构…

这一次大家琢磨的是第陆版本的binlogfile,
一般5.0.x以上的mysql使用该版本的binlogfile。

此番我们谈论的是第陆版本的binlogfile,
1般伍.0.x以上的mysql使用该版本的binlogfile。

摘要: 概述
MySQL的装置能够参考:Linux(CentOS)中常用软件设置,使用及尤其——MySQL,
VmTools MySQL关于Binlog的合法文书档案:The Binary Log
基于Binlog的主备复制:MySQL主备复制原理、实现及格外处理 什么是 Binlog
MySQL Server 有各个类型的日记——Error Log、General Query Log、Binary Log
和 Slow Query Log。

首先应对第3个难题

第一应对第2个难点

概述

MySQL的装置能够参照:Linux(CentOS)中常用软件设置,使用及这一个——MySQL,
VmTools

MySQL关于Binlog的法定文书档案:The Binary
Log

基于Binlog的主备复制:MySQL主备复制原理、完成及特别处理

一、binlog file的构成

一、binlog file的构成

什么是 Binlog

MySQL Server 有八种档次的日记——Error Log、General Query Log、Binary Log
和 Slow Query Log。

第三个是大错特错日志,记录 mysqld 的壹些漏洞非常多。第3个是一般查询日志,记录
mysqld 正在做的工作,比如客户端的连接和断开、来自客户端每条 Sql
Statement 记录信息;假设你想准确精通客户端到底传了什么瞎 [哔哔]
玩意儿给服务端,那些日志就老大管用了,可是它丰硕影响属性。第陆个是慢查询日志,记录壹些查询相比较慢的
SQL 语句——那种日志非平日用,主假设给开采者调优先使用的。

结余的第三种正是 Binlog
了,包括了部分事变,那一个事件描述了数据库的改变,如建表、数据变动等,也席卷一些诡秘更改,比如
DELETE FROM ran WHERE bing =
luan,可是一条数据都没被删掉的那种情景。除非动用 Row-based
logging,不然会蕴涵全数改造数据的 SQL Statement。

那正是说 Binlog
就有了八个重点的用处——复制和回复。比如主从表的复制,和备份恢复生机什么的。

总来说之,大家奉行SELECT等不设计数据变动的语句是不会记录Binlog的,而关系到数码更新则会记录。要留心的是,对支撑工作的内燃机如InnoDB来讲,必必要提交了政工才会记录Binlog。Binlog是在作业最后commit前写入的,binlog曾几何时刷新到磁盘跟参数sync_binlog相关。假使设置为0,则表示MySQL不调整binlog的刷新,由文件系统去决定它缓存的基础代谢,而只要设置为不为0的值则代表每sync_binlog次职业,MySQL调用文件系统的刷新操作刷新binlog到磁盘中。设为1是最安全的,在系统故障时最多有失1个政工的翻新,可是会对质量兼备影响,一般景况下会设置为100或许0,捐躯一定的一致性来获得更加好的质量。

(一)binlog file的大概构成

(一)binlog file的光景构成

敞开和停用Binlog

经过配置/etc/my.cnf配置文件的log-bin选项:

[mysqld]
log-bin=mysql-bin

本条需求重启MySQL服务。 
能够行使SET SQL_LOG_BIN=0命令结束使用日志文件,然后能够通过SET
SQL_LOG_BIN=一命令来启用。

其一难题莫过于后面也回复过,但是很不深入。此番,作者会深度探究它,首先大家扒壹扒官方的布道;

本条难点莫过于前边也回复过,但是很不浓密。此次,笔者会深度查究它,首先大家扒壹扒官方的说教;

Binlog的删除

mysql> show variables like 'expire_log_days';
mysql>  set global expire_log_days=3;  //过期删除
mysql> reset master; //删除master的binlog
mysql> reset slave; //删除slave的中继日志
mysql> purge master logs before '2016-10-20 16:25:00';//删除指定日期前的日志索引中binlog日志文件
mysql> purge master logs to 'binlog.000002';//删除指定日志文件

除外以上办法之外,也足以应用操作系统的地头命令删除文件。

Binlog文件的扩张

当碰到以下3种情况时会重新生成3个新的日记文件,文件序号递增:

  1. MySQL服务器甘休或重启时,MySQL会在重启时生成3个新的日记文件;
  2. 使用flush logs命令;
  3. 当binlog文件大小超越max_binlog_size系统变量配置的上限期;

binlog文件的最大值和暗许值是1GB,该装置并无法严苛调节binlog的大小,尤其是binlog比较接近最大值而又遇上三个比较大事务时,为了保证工作的完整性,不容许做切换日志的动作,只好将该业务的富有SQL都记录到方今几天记,直到工作结束。

那块就说了一句话:binlog file是由binlog file header和binlog
events构成的,至于binlog file header其实便是0xfe626玖陆e。换言之,binlog
file先写了个0xfe626九陆e,然后前面随着多数binlog event
。官方的文书档案依然很给力的,大家能够展开任意3个binlog
file,以1陆进制格局张开,开首就是0xfe626玖陆e。

这块就说了一句话:binlog file是由binlog file header和binlog
events构成的,至于binlog file header其实就是0xfe626玖六e。换言之,binlog
file先写了个0xfe626玖陆e,然后前面随着大多binlog event
。官方的文档如故很给力的,大家能够张开任意三个binlog
file,以1六进制情势张开,开端正是0xfe626玖陆e。

Binlog的日志格式

binlog有三种格式:Statement, Row和Mixed.

  • 依据SQL语句的复制(statement-based replication, SB安德拉)
  • 据悉行的复制(row-based replication, RB猎豹CS陆)
  • 混合方式复制(mixed-based replication, MB瑞鹰)

Statement

每一条会修改数据的sql都会记录在binlog中。

可取:不须求记录每一行的退换,收缩了binlog日志量,节约了IO, 提升了品质。

症结:由于记录的只是执行语句,为了那个语句能在slave上正确运维,因而还非得记录每条语句在施行的时候的有的连锁新闻,以管教具有语句能在slave获得和在master端试行的时候一样的结果。其它mysql的复制,像1些特定函数的功用,slave可与master上要保持一致会有数不完连锁主题素材。

相比较row能节省多少质量与日志量,那一个取决于应用的SQL情形,平常同一条记下修改或许插入row格式所发生的日志量还小鱼statement发生的日志量,不过思考到假如带条件的update操作,以及整表删除,alter表等操作,row格式会发生大批量日记,因而在设想是否选取row格式日志时应当依照使用的莫过于景况,其所发出的日志量会加多多少,以及带来的IO品质难点。

Row

5.壹.5本子的MySQL才起来帮忙row
level的复制,它不记录sql语句上下文相关新闻,仅保留哪条记下被改换。

优点:
binlog中能够不记录实施的sql语句的上下文相关的音讯,仅要求记录那一条记下被涂改成怎么样了。所以row的日记内容会至极清楚的记录下每一行数据修改的底细。而且不会现出某个特定情景下的积存进程,或function,以及trigger的调用和接触不可能被科学复制的难题.

症结:全部的施行的言辞当记录到日志中的时候,都将以每行记录的退换来记录,那样恐怕会时有爆发大批量的日志内容。

新本子的MySQL中对row level情势也被做了优化,并不是富有的修改都会以row
level来记录,像遇到表结构改造的时候就会以statement形式来记录,即使sql语句实在就是update或许delete等修改数据的口舌,那么依然会记录全部行的更改。

Mixed

从五.一.八本子开首,MySQL提供了Mixed格式,实际上正是Statement与Row的叁结合。 
在Mixed方式下,一般的说话修改使用statment格式保存binlog,如一些函数,statement无法完结主从复制的操作,则接纳row格式保存binlog,MySQL会依据施行的每一条现实的sql语句来差异对待记录的日记格局,也正是在Statement和Row之间接选举择一种。


(2)binlog events的集体章程

(二)binlog events的团伙办法

详述

多数binlog event是不是存在着温馨的组织格局啊?答案是自然则然的,跟在binlog
file
header前边的相似先是Binlog::FORMAT_DESCRIPTION_EVENT,那是第4本子的binlog
event的开首,那些会在本文的”二、binlog events的结缘”中详尽提到。

大多binlog event是不是存在着团结的团队办法吗?答案是必然的,跟在binlog
file
header后边的形似先是Binlog::FORMAT_DESCRIPTION_EVENT,那是第肆版本的binlog
event的发轫,那么些会在本文的”二、binlog events的咬合”中详细提到。

查看Binlog文件

查阅当前服务器使用的二进制文件及大小:

mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       126 |
| mysql-bin.000002 |       126 |
| mysql-bin.000003 |      6819 |
| mysql-bin.000004 |      2749 |
| mysql-bin.000005 |      1475 |
+------------------+-----------+

呈现主服务器使用的贰进制文件及大小:

mysql> show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       126 |
| mysql-bin.000002 |       126 |
| mysql-bin.000003 |      6819 |
| mysql-bin.000004 |      2749 |
| mysql-bin.000005 |      1475 |
+------------------+-----------+

来妥帖前使用的贰进制文件及所处地点:

mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000005 |     1475 |              |                  |
+------------------+----------+--------------+------------------+

binlog_do_db:此参数表示只记录像定数据库的二进制日志 
binlog_ignore_db:此参数标示不记录钦点的数据库的二进制日志

亟待查阅有些具体binlog文件的剧情时,以“mysql-bin.000005”为例。 
在MySQL客户端输入:show binlog events in “mysql-bin.00000伍”; 
功能如下所示:

mysql> show binlog events in 'mysql-bin.000005';
+------------------+-----+-------------+-----------+-------------+---------------------------------------+
| Log_name         | Pos | Event_type  | Server_id | End_log_pos | Info                                  |
+------------------+-----+-------------+-----------+-------------+---------------------------------------+
| mysql-bin.000005 |   4 | Format_desc |         2 |         107 | Server ver: 5.5.51-log, Binlog ver: 4 |
| mysql-bin.000005 | 107 | Query       |         2 |         181 | BEGIN                                 |
| mysql-bin.000005 | 181 | Table_map   |         2 |         239 | table_id: 44 (canal_test.company)     |
| mysql-bin.000005 | 239 | Write_rows  |         2 |         287 | table_id: 44 flags: STMT_END_F        |
| mysql-bin.000005 | 287 | Xid         |         2 |         314 | COMMIT /* xid=23915 */                |
| mysql-bin.000005 | 314 | Query       |         2 |         388 | BEGIN                                 |
| mysql-bin.000005 | 388 | Table_map   |         2 |         449 | table_id: 35 (canal_test.person)      |
| mysql-bin.000005 | 449 | Update_rows |         2 |         526 | table_id: 35 flags: STMT_END_F        |
| mysql-bin.000005 | 526 | Xid         |         2 |         553 | COMMIT /* xid=26960 */                |
| mysql-bin.000005 | 553 | Query       |         2 |         627 | BEGIN                                 |
| mysql-bin.000005 | 627 | Table_map   |         2 |         688 | table_id: 35 (canal_test.person)      |
| mysql-bin.000005 | 688 | Write_rows  |         2 |         741 | table_id: 35 flags: STMT_END_F        |
| mysql-bin.000005 | 741 | Xid         |         2 |         768 | COMMIT /* xid=26961 */                |
| mysql-bin.000005 | 768 | Query       |         2 |         842 | BEGIN                                 |
| mysql-bin.000005 | 842 | Table_map   |         2 |         903 | table_id: 35 (canal_test.person)      |
| mysql-bin.000005 | 903 | Delete_rows |         2 |         956 | table_id: 35 flags: STMT_END_F        |
| mysql-bin.000005 | 956 | Xid         |         2 |         983 | COMMIT /* xid=26964 */                |
+------------------+-----+-------------+-----------+-------------+---------------------------------------+
17 rows in set (0.00 sec)

如故应用mysqlbinlog命令,在shell终端输入(要是当前目录为
../mysql/data): ../bin/mysqlbinlog mysql-bin.000005

[root@zhuzhonghua1-c6uu8 data]# pwd
/usr/local/mysql/data
[root@zhuzhonghua1-c6uu8 data]# ../bin/mysqlbinlog mysql-bin.000005
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#161020 11:07:29 server id 2  end_log_pos 107   Start: binlog v 4, server v 5.5.51-log created 161020 11:07:29
# Warning: this binlog is either in use or was not closed properly.
BINLOG '
8TQIWA8CAAAAZwAAAGsAAAABAAQANS41LjUxLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAVAAEGggAAAAICAgCAA==
'/*!*/;
# at 107
#161020 11:08:50 server id 2  end_log_pos 181   Query   thread_id=162   exec_time=1 error_code=0
SET TIMESTAMP=1476932930/*!*/;
SET @@session.pseudo_thread_id=162/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=0/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 181
# at 239
#161020 11:08:50 server id 2  end_log_pos 239   Table_map: `canal_test`.`company` mapped to number 44
#161020 11:08:50 server id 2  end_log_pos 287   Write_rows: table id 44 flags: STMT_END_F

BINLOG '
QjUIWBMCAAAAOgAAAO8AAAAAACwAAAAAAAEACmNhbmFsX3Rlc3QAB2NvbXBhbnkAAwMPDwQsASwB
Bg==
QjUIWBcCAAAAMAAAAB8BAAAAACwAAAAAAAEAA//4AgAAAAIAZHAIAHNoYW5naGFp
'/*!*/;
# at 287
#161020 11:08:50 server id 2  end_log_pos 314   Xid = 23915
COMMIT/*!*/;
# at 314
#161020 12:03:50 server id 2  end_log_pos 388   Query   thread_id=162   exec_time=0 error_code=0
SET TIMESTAMP=1476936230/*!*/;
BEGIN
/*!*/;
# at 388
# at 449
#161020 12:03:50 server id 2  end_log_pos 449   Table_map: `canal_test`.`person` mapped to number 35
#161020 12:03:50 server id 2  end_log_pos 526   Update_rows: table id 35 flags: STMT_END_F

BINLOG '
JkIIWBMCAAAAPQAAAMEBAAAAACMAAAAAAAEACmNhbmFsX3Rlc3QABnBlcnNvbgAFAw8D/g8GLAH+
AywBHg==
JkIIWBgCAAAATQAAAA4CAAAAACMAAAAAAAEABf//4AEAAAADAHp6aAIAAAABbQQAaGVyZeABAAAA
AwB6emgCAAAAAW0HAG5hbmppbmc=
'/*!*/;
# at 526
#161020 12:03:50 server id 2  end_log_pos 553   Xid = 26960
COMMIT/*!*/;
# at 553
#161020 12:05:56 server id 2  end_log_pos 627   Query   thread_id=162   exec_time=0 error_code=0
SET TIMESTAMP=1476936356/*!*/;
BEGIN
/*!*/;
# at 627
# at 688
#161020 12:05:56 server id 2  end_log_pos 688   Table_map: `canal_test`.`person` mapped to number 35
#161020 12:05:56 server id 2  end_log_pos 741   Write_rows: table id 35 flags: STMT_END_F

BINLOG '
pEIIWBMCAAAAPQAAALACAAAAACMAAAAAAAEACmNhbmFsX3Rlc3QABnBlcnNvbgAFAw8D/g8GLAH+
AywBHg==
pEIIWBcCAAAANQAAAOUCAAAAACMAAAAAAAEABf/gBAAAAAQAenpoNBYAAAABbQUAd2hlcmU=
'/*!*/;
# at 741
#161020 12:05:56 server id 2  end_log_pos 768   Xid = 26961
COMMIT/*!*/;
# at 768
#161020 12:06:34 server id 2  end_log_pos 842   Query   thread_id=162   exec_time=0 error_code=0
SET TIMESTAMP=1476936394/*!*/;
BEGIN
/*!*/;
# at 842
# at 903
#161020 12:06:34 server id 2  end_log_pos 903   Table_map: `canal_test`.`person` mapped to number 35
#161020 12:06:34 server id 2  end_log_pos 956   Delete_rows: table id 35 flags: STMT_END_F

BINLOG '
ykIIWBMCAAAAPQAAAIcDAAAAACMAAAAAAAEACmNhbmFsX3Rlc3QABnBlcnNvbgAFAw8D/g8GLAH+
AywBHg==
ykIIWBkCAAAANQAAALwDAAAAACMAAAAAAAEABf/gBAAAAAQAenpoNBYAAAABbQUAd2hlcmU=
'/*!*/;
# at 956
#161020 12:06:34 server id 2  end_log_pos 983   Xid = 26964
COMMIT/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

截取下面的一段举办剖析:

# at 314
#161020 12:03:50 server id 2  end_log_pos 388   Query   thread_id=162   exec_time=0 error_code=0
SET TIMESTAMP=1476936230/*!*/;
BEGIN
/*!*/;

上边输出包罗如下要素:

  • position: 位于文件中的地方,即首先行的(# at
    314),表达该事件记录从文件第贰17个字节伊始
  • timestamp: 事件爆发的大运戳,即第二行的(#161020 11:07:29)
  • exec_time: 事件执行的消费时间
  • error_code: 错误码
  • server id: 服务器标记(二)
  • thread_id: 代理线程id (thread_id=162)
  • type:事件类型Query(参考下1章节)

使用mysqlbinlog命令还是能开始展览数据库苏醒,使用日志进行还原时,需求各样进行,即最早转移的日志文件要首先复苏:

mysqlbinlog mysql-bin.000001 | mysql -uroot -proot
mysqlbinlog mysql-bin.000002 | mysql -uroot -proot
.....

进而1般是事务性的binlog events,要强调的是,在binlog
file里全部的update, delete, insert语句都以存在于一组事务性的binlog
event。

继之1般是事务性的binlog events,要重申的是,在binlog
file里全部的update, delete, insert语句都以存在于壹组事务性的binlog
event。

Binlog事件

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

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

Binlog事件类型

binlog事件类型壹共有八个本子:

  • v1: Used in MySQL 3.23
  • v3: Used in MySQL 4.0.2 though 4.1
  • v4: Used in MySQL 5.0 and up

v二出现了异常的短的光阴,并且已经不被接济

今昔所使用的MySQL一般都是伍.5起了,所以上面陈述的都以v四版的binlog事件类型。

binlog的事件类型1共有以下二种:

enum Log_event_type { 
  UNKNOWN_EVENT= 0, 
  START_EVENT_V3= 1, 
  QUERY_EVENT= 2, 
  STOP_EVENT= 3, 
  ROTATE_EVENT= 4, 
  INTVAR_EVENT= 5, 
  LOAD_EVENT= 6, 
  SLAVE_EVENT= 7, 
  CREATE_FILE_EVENT= 8, 
  APPEND_BLOCK_EVENT= 9, 
  EXEC_LOAD_EVENT= 10, 
  DELETE_FILE_EVENT= 11, 
  NEW_LOAD_EVENT= 12, 
  RAND_EVENT= 13, 
  USER_VAR_EVENT= 14, 
  FORMAT_DESCRIPTION_EVENT= 15, 
  XID_EVENT= 16, 
  BEGIN_LOAD_QUERY_EVENT= 17, 
  EXECUTE_LOAD_QUERY_EVENT= 18, 
  TABLE_MAP_EVENT = 19, 
  PRE_GA_WRITE_ROWS_EVENT = 20, 
  PRE_GA_UPDATE_ROWS_EVENT = 21, 
  PRE_GA_DELETE_ROWS_EVENT = 22, 
  WRITE_ROWS_EVENT = 23, 
  UPDATE_ROWS_EVENT = 24, 
  DELETE_ROWS_EVENT = 25, 
  INCIDENT_EVENT= 26, 
  HEARTBEAT_LOG_EVENT= 27, 
  IGNORABLE_LOG_EVENT= 28,
  ROWS_QUERY_LOG_EVENT= 29,
  WRITE_ROWS_EVENT_V2 = 30,
  UPDATE_ROWS_EVENT_V2 = 31,
  DELETE_ROWS_EVENT_V2 = 32,
  GTID_LOG_EVENT= 33,
  ANONYMOUS_GTID_LOG_EVENT= 34,
  PREVIOUS_GTIDS_LOG_EVENT= 35, 
  ENUM_END_EVENT 
  /* end marker */ 
};

20-22四个门类未来壹度被飞起,那多少个门类只现出在MySQL的五.一.伍-⑤.一.7本子中。未来(从5.一.7版本开始)使用的WMuranoITE,
UPDATE, DELETE多少个事件类型分别采纳二三,二4,贰五。

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 
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 

事件类型简述

QUERY_EVENT

记录一条query语句,在遵照语句的复制和基于行的复制都会有。

ROTATE_EVENT

贰进制日志改变三个新文件,恐怕因为文件大小达到限制,只怕是mysql重启,亦可能是调用了flush
logs命令。

XID_EVENT

Commit事件

WRITE_ROWS_EVENT, UPDATE_ROWS_EVENT, DELETE_ROWS_EVENT

统称为ROW EVENT, 只有在依照row的复制格局下才会发出。

  • WRITE_ROWS_EVENT:包蕴了要插入的数据
  • UPDATE_ROWS_EVENT:包罗了改换前的值,也饱含了修改后的值
  • DELETE_ROWS_EVENT:包罗了亟待删除行前的值

TABLE_MAP_EVENT

ROW EVENT此前产生,为的是对ROW EVENT解析提供基于。

FORMAT_DESCRIPTION_EVENT

MySQL依照其定义来分析其余事件

INTVAR_EVET

在statement时行使到,用于自增类型auto_increment.

STOP_EVENT

MySQL甘休时,在文件尾到场STOP_EVENT

更加多事件类型能够参考MySQL官方文书档案:

 

 

事件类型分析

种种event都有一个1几个字节的Binlog 伊芙nt Header(如下图),
包涵多个字节的timestamep, 八个字节的Binlog 伊芙nt type,
6个字节的server_id(该id注明binlog的源server是哪位,用来在循环复制中中原人民共和国龙event),四个字节的event包大小,八个字节的下三个event开端偏移,多少个字节的Binlog
伊芙nt Flag. extra_headers最近的event中平昔不提到到,预留用。

V4 event structure:

997755.com澳门葡京 1

多少个新的binlog文件都是以FOCRUISERMAT_DESCRIPTION_EVENT先河的(v肆版)。这里就以FOWranglerMAT_DESCRIPTION_EVENT为例来分析下(mysql-bin.000005)。通过hexdump
-C mysql-bin.00000五来查阅二进制文件。(上边只列出某个剧情)

[root@zhuzhonghua1-c6uu8 data]# hexdump -C mysql-bin.000005 
00000000  fe 62 69 6e f1 34 08 58  0f 02 00 00 00 67 00 00  |.bin.4.X.....g..|
00000010  00 6b 00 00 00 01 00 04  00 35 2e 35 2e 35 31 2d  |.k.......5.5.51-|
00000020  6c 6f 67 00 00 00 00 00  00 00 00 00 00 00 00 00  |log.............|
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000040  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 13  |................|
00000050  38 0d 00 08 00 12 00 04  04 04 04 12 00 00 54 00  |8.............T.|
00000060  04 1a 08 00 00 00 08 08  08 02 00 42 35 08 58 02  |...........B5.X.|
00000070  02 00 00 00 4a 00 00 00  b5 00 00 00 08 00 a2 00  |....J...........|
00000080  00 00 01 00 00 00 0a 00  00 1a 00 00 00 00 00 00  |................|
00000090  01 00 00 00 00 00 00 00  00 06 03 73 74 64 04 21  |...........std.!|

遵照合法文书档案中的表达来看下FO翼虎MAT_DESCRIPTION_EVENT格式:

v4 format description event

997755.com澳门葡京 2

binlog是小端字节序的。binlog前五个字节是魔数:0xFE 0x6二 0x6玖 0x陆E.
接着是贰个FOQX56MAT_DESCRIPTION_EVENT,先看下213个字节的event header. f1
3肆 08
5八即0x58083四f1是指时间戳,占五个字节;第四个字节0x0f是type_code即event
type(FORMAT_DESCRIPTION_EVENT=15);接着4个字节02 00 00 00
即0x00000002是server_id;再接着4个字节67 00 00
00是event_length=0x000000陆7=十三;然后两个字节陆b 00 00
00是下三个next_position=0x000000六b=十柒;接着八个字节0100是flag=0x0001=1,1为LOG_EVENT_BINLOG_IN_USE_F,标志binlog还尚未关闭,binlog关闭后,flag会棉被服装置为0。这样四+①+4+四+四+二=二十个字节。

event data部分分成fixed data和variable data两局地,当中fixed
data是event的定势长度和格式的数额,variable
data则是长度变化的多少,比如FORAV四MAT_DESCRIPTION_EVENT的fix
data长度是0x54=八四字节。上边看下那八肆=2+50+肆+一+二八个字节的分红:开头的一个字节0x000四是binlog的版本号;接着的4十多个字节为mysql-server版本5.五.5一-log;接下去6个字节是binlog创造时间,那里是0;然后2个字节是0x一3是指之后全部event的公家长度,那里都是19;接着贰7个字节中每一种字节为mysql已知的event(共二多少个)的fixed
data的尺寸;可以发现FO奇骏MAT_DESCRIPTION_EVENT自己的variable
data部分为空。

 

 

 

 

 

 

 

 

 

 

 

 

至于mixed格式就是statement格式
row格式**轮流出现,三种格式的不等也就在这些地点,至于上边看到的binlog
events的格式,我们将要本文的”2、binlog events的组成”中详细提到。

至于mixed格式就是statement格式
row格式**轮换现身,三种格式的不相同也就在这一个方面,至于上边看到的binlog
events的格式,我们就要本文的”贰、binlog events的组合”中详尽提到。

终极会以STOP_EVENT或者ROTATE_EVENT末段,那多少个也会在本文的”二、binlog
events的重组”中详细提到。

最终会以STOP_EVENT或者ROTATE_EVENT终极,那八个也会在本文的”2、binlog
events的结缘”中详细提到。

其余的有的binlog event不是越发重大,风乐趣的能够通过

其他的壹些binlog event不是特地主要性,风乐趣的能够通过

 二、binlog event的构成

 二、binlog event的构成

 (1)binlog event的构成

 (1)binlog event的构成

binlog event分为4有些:common header, post header,
body以及footor,翻译手艺简单,不知晓怎么翻译,不过一旦领会就好,common
header和footor是集体全部的,而post header, body则是每一种event都独有的。

binlog event分为肆片段:common header, post header,
body以及footor,翻译本领简单,不明了怎么翻译,可是如若通晓就好,common
header和footor是集体全体的,而post header, body则是每一种event都独有的。

common header 一般包罗上面多少个

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 的版本号
名称 格式 描述
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则含有四个crc3二校验码,它的格式是四字节的整形。

footor则带有二个crc32校验码,它的格式是4字节的整形。

(2)重要的binlog event的构成

(2)重要的binlog event的构成

1)FORMAT_DESCRIPTION_EVENT

1)FORMAT_DESCRIPTION_EVENT

参考自

参考自

body:

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的长度
名称 格式 描述
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

2)Xid_event

参考自

参考自

body:

body:

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

 

 

 

 

 

 

3) Anonymous_gtid_event

3) Anonymous_gtid_event

从未有过得以参考的网址

并未有得以参照的网址

post header:

post header:

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

 

 

 

 

 

 

 

 

 

 

body:

body:

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

 

 

 

 

 

 

 

 

4)STOP_EVENT

4)STOP_EVENT

参考自

参考自

没有post header和body

没有post header和body

5)ROTATE_EVENT

5)ROTATE_EVENT

参考自

参考自

post header:

post header:

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

 

 

 

 

 

 

 

 

body:

body:

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

 

 

 

 

 

 

 

 

6)Table_map_event 

6)Table_map_event 

参考自

参考自

post header

post header

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

 

 

 

 

 

 

 

 

body:

body:

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

7)ROWS_EVENT

参考自

参考自

post header

post header

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

 

 

 

 

 

 

 

 

body

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

名称 格式 描述
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

8) QUERY_EVENT

参考自

参考自

post header

post header

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

 

 

 

 

 

 

 

 

 

 

 

 

body

body

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

 

 

 

 

 

 

 

 

三、伪造的binlog文件

三、伪造的binlog文件

最近透过下边的牵线,大家早就能伪造我们的binlog文件,只然则大家只能打肿脸充胖子statement格式下的binlog,因为row格局下的binlog是内需sql试行时的实在数据的。

今昔经过上边的介绍,大家早已能改朝换代大家的binlog文件,只可是大家只好打肿脸充胖子statement格式下的binlog,因为row形式下的binlog是索要sql实践时的实际数据的。

四、补充:

四、补充:

1.INTVAR_EVENT

1.INTVAR_EVENT

对于写入带有自增列的表时,binlog会在statement格局下扩大一个事变,就是IN电视机A冠道_EVENT,他会规定插入的讲话的自增列数,1般出现在BEGIN的Query_event之后,出现在平时的Query_event从前,mysqlbinlog会把它解析成”SET
INSERT_ID = 自增id”语句后

对此写入带有自增列的表时,binlog会在statement格局下扩张三个风浪,正是IN电视机A奥迪Q7_EVENT,他会鲜明插入的说话的自增列数,壹般出现在BEGIN的Query_event之后,出现在平常的Query_event从前,mysqlbinlog会把它解析成”SET
INSERT_ID = 自增id”语句后

大家得以看到他的格式如图所示

咱俩得以看看她的格式如图所示

body

body

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

 

 

 

997755.com澳门葡京, 

 

 

 

 

关于type类型,大家早已认同的是在上述的场合中类型是INSERT_ID_EVENT,而别的二种类型INVALID_INT_EVENT和LAST_INSERT_ID_EVENT还尚未出现过,为此那是待确认的风云,以往补充。

有关type类型,大家已经承认的是在上述的情状中类型是INSERT_ID_EVENT,而任何三种档次INVALID_INT_EVENT和LAST_INSERT_ID_EVENT还尚无出现过,为此那是待确认的轩然大波,未来补充。

 

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website