Binlog(二)之 文件结构与文件解读
下文所有的描述都是基于MySQL5.7版本。
文章目录
- 一、Binlog日志文件组成
- 二、MySQLBinlog工具
- 2.1创建库
- 2.2 mysqlbinlog不添加参数解析
- 2.2 mysqlbinlog -v参数
- 2.3 mysqlbinlog -vv参数
- 三、参考
- 四、相关文章
一、Binlog日志文件组成
Binlog日志都是由事件构成,在MySQL源码中,这些序列化好的事件都是序列化于log_event.h
这一个C++基类,
而Log_event是基类,其他具体的事件子类是从它进行派生的。
而在MySQL利用Binlog进行主从数据同步时,其实也就是主服务将Binlog中实时发送给从服务器,从服务拿着Log_event反序列化成对象,再去执行即可。
需要注意的是,日志中的每一个事件,其元数据一共有四种形式,但是大体上事件都分为了event header
与event data
两个部分;
在V1、V2(在MySQL4.x用了一小阵子就删除了)、V3、V4版本中只是对event header
的变化。
这里主要看一下V4对event的描述:
image.png
使用二进制查看工具直接查看Binlog日志文件,内容如下:
e62 696ef 738f d660 0f01 0000 0077 0000
007b 0000 0000 0004 0035 2e37 2e33 322d
6c6f 6700 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0073 8fd6 6013
380d 0008 0012 0004 0404 0412 0000 5f00
041a 0800 0000 0808 0802 0000 000a 0a0a
2a2a 0012 3400 0142 e3da 2a74 8fd6 6023
0100 0000 1f00 0000 9a00 0000 8000 0000
0000 0000 0000 cdbd ec73 b5e2 d660 2201
0000 0041 0000 00db 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0200 0000 0000 0000 0001
如果有兴趣的话,可以针对上图对事件描述规则,来人工解析上述十六进制表述形式的Binlog文件。
二、MySQLBinlog工具
我们可以直接使用MySQL提供的MySQLBinlog工具对Binlog日志进行解析,当然mysqlbinlog工具并不是只能将二进制binlog日志文件解析为可读文件,更重要的是,他可以用来做数据恢复工作。详细参见官网:
https://dev.mysql.com/doc/refman/5.7/en/mysqlbinlog.html
,这里只是先演示一下mysqlbinlog解析binlog。
2.1创建库
# 创建数据库
CREATE TABLE t
( id INT NOT NULL, name VARCHAR(20) NOT NULL, date DATE NULL )
ENGINE = InnoDB;
# 开启事务,在事务未提交之前,数据更改不会直接记录进入Binlog文件,而是先记录在Cache缓存中,等待commit的调用
START TRANSACTION;
INSERT INTO t VALUES(1, 'apple', NULL);
UPDATE t SET name = 'pear', date = '2009-01-01' WHERE id = 1;
DELETE FROM t WHERE id = 1;
# 提交事务
COMMIT;
2.2 mysqlbinlog不添加参数解析
shell> mysqlbinlog log_file
...
# at 218
#080828 15:03:08 server id 1 end_log_pos 258 Write_rows: table id 17 flags: STMT_END_F
BINLOG ' fAS3SBMBAAAALAAAANoAAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ= fAS3SBcBAAAAKAAAAAIBAAAQABEAAAAAAAEAA//8AQAAAAVhcHBsZQ== '/*!*/; ...
# at 302
#080828 15:03:08 server id 1 end_log_pos 356 Update_rows: table id 17 flags: STMT_END_F
BINLOG ' fAS3SBMBAAAALAAAAC4BAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ= fAS3SBgBAAAANgAAAGQBAAAQABEAAAAAAAEAA////AEAAAAFYXBwbGX4AQAAAARwZWFyIbIP '/*!*/; ...
# at 400
#080828 15:03:08 server id 1 end_log_pos 442 Delete_rows: table id 17 flags: STMT_END_F
BINLOG ' fAS3SBMBAAAALAAAAJABAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ= fAS3SBkBAAAAKgAAALoBAAAQABEAAAAAAAEAA//4AQAAAARwZWFyIbIP '/*!*/;
2.2 mysqlbinlog -v参数
添加-v参数可以展现伪SQL语句
shell> mysqlbinlog -v log_file
...
# at 218
#080828 15:03:08 server id 1 end_log_pos 258 Write_rows: table id 17 flags: STMT_END_F
BINLOG '
fAS3SBMBAAAALAAAANoAAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBcBAAAAKAAAAAIBAAAQABEAAAAAAAEAA//8AQAAAAVhcHBsZQ==
'/*!*/;
### INSERT INTO test.t
### SET
### @1=1
### @2='apple'
### @3=NULL
...
# at 302
#080828 15:03:08 server id 1 end_log_pos 356 Update_rows: table id 17 flags: STMT_END_F
BINLOG '
fAS3SBMBAAAALAAAAC4BAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBgBAAAANgAAAGQBAAAQABEAAAAAAAEAA////AEAAAAFYXBwbGX4AQAAAARwZWFyIbIP
'/*!*/;
### UPDATE test.t
### WHERE
### @1=1
### @2='apple'
### @3=NULL
### SET
### @1=1
### @2='pear'
### @3='2009:01:01'
...
# at 400
#080828 15:03:08 server id 1 end_log_pos 442 Delete_rows: table id 17 flags: STMT_END_F
BINLOG '
fAS3SBMBAAAALAAAAJABAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBkBAAAAKgAAALoBAAAQABEAAAAAAAEAA//4AQAAAARwZWFyIbIP
'/*!*/;
### DELETE FROM test.t
### WHERE
### @1=1
### @2='pear'
### @3='2009:01:01'
2.3 mysqlbinlog -vv参数
可以显示每列的数据类型和一些元数据
shell> mysqlbinlog -vv log_file
...
# at 218
#080828 15:03:08 server id 1 end_log_pos 258 Write_rows: table id 17 flags: STMT_END_F
BINLOG '
fAS3SBMBAAAALAAAANoAAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBcBAAAAKAAAAAIBAAAQABEAAAAAAAEAA//8AQAAAAVhcHBsZQ==
'/*!*/;
### INSERT INTO test.t
### SET
### @1=1 /* INT meta=0 nullable=0 is_null=0 */
### @2='apple' /* VARSTRING(20) meta=20 nullable=0 is_null=0 */
### @3=NULL /* VARSTRING(20) meta=0 nullable=1 is_null=1 */
...
# at 302
#080828 15:03:08 server id 1 end_log_pos 356 Update_rows: table id 17 flags: STMT_END_F
BINLOG '
fAS3SBMBAAAALAAAAC4BAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBgBAAAANgAAAGQBAAAQABEAAAAAAAEAA////AEAAAAFYXBwbGX4AQAAAARwZWFyIbIP
'/*!*/;
### UPDATE test.t
### WHERE
### @1=1 /* INT meta=0 nullable=0 is_null=0 */
### @2='apple' /* VARSTRING(20) meta=20 nullable=0 is_null=0 */
### @3=NULL /* VARSTRING(20) meta=0 nullable=1 is_null=1 */
### SET
### @1=1 /* INT meta=0 nullable=0 is_null=0 */
### @2='pear' /* VARSTRING(20) meta=20 nullable=0 is_null=0 */
### @3='2009:01:01' /* DATE meta=0 nullable=1 is_null=0 */
...
# at 400
#080828 15:03:08 server id 1 end_log_pos 442 Delete_rows: table id 17 flags: STMT_END_F
BINLOG '
fAS3SBMBAAAALAAAAJABAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
fAS3SBkBAAAAKgAAALoBAAAQABEAAAAAAAEAA//4AQAAAARwZWFyIbIP
'/*!*/;
### DELETE FROM test.t
### WHERE
### @1=1 /* INT meta=0 nullable=0 is_null=0 */
### @2='pear' /* VARSTRING(20) meta=20 nullable=0 is_null=0 */
### @3='2009:01:01' /* DATE meta=0 nullable=1 is_null=0 */
三、参考
- https://dev.mysql.com/doc/internals/en/event-classes-and-types.html
- https://dev.mysql.com/doc/internals/en/event-structure.html
四、相关文章
- [Binlog(一) 之 作用、三种模式介绍] : https://www.jianshu.com/p/bc5a5236c2c1
- [Binlog(三) 之 数据误删恢复] : https://www.jianshu.com/p/95f9be2d5982