解析MySQL binlog --(5)ROWS_EVENT:WRITE_ROWS_EVENT、UP

1、介绍

对于statement格式的binlog,所有增删改的SQL语句都记录在QUERY_EVENT中,而row格式的binlog则以ROWS_EVENT格式记录对数据库的修改。ROWS_EVENT分为3种:WRITE_ROWS_EVENT、UPDATE_ROWS_EVENT、DELETE_ROWS_EVENT,分别对应insert、update、delete。WRITE_ROWS_EVENT包含了要插入的数据;UPDATE_ROWS_EVENT不仅包含行修改后的值,也包括修改前的值;DELETE_ROWS_EVENT仅仅记录删除行的主键值。
2、定义格式

3、案例讲解

mysql> show binlog events in "mysql-bin.000002";
+------------------+------+-------------+-----------+-------------+-----------------------------------------------------------------+
| Log_name         | Pos  | Event_type  | Server_id | End_log_pos | Info                                                            |
+------------------+------+-------------+-----------+-------------+-----------------------------------------------------------------+
| mysql-bin.000002 |    4 | Format_desc |        11 |         120 | Server ver: 5.6.26-debug-log, Binlog ver: 4                     |
| mysql-bin.000002 |  120 | Query       |        11 |         191 | BEGIN                                                           |
| mysql-bin.000002 |  191 | Table_map   |        11 |         236 | table_id: 70 (yzs.t1)                                           |
| mysql-bin.000002 |  236 | Write_rows  |        11 |         280 | table_id: 70 flags: STMT_END_F                                  |
| mysql-bin.000002 |  280 | Xid         |        11 |         311 | COMMIT /* xid=9 */                                              |
| mysql-bin.000002 |  311 | Query       |        11 |         382 | BEGIN                                                           |
| mysql-bin.000002 |  382 | Table_map   |        11 |         427 | table_id: 70 (yzs.t1)                                           |
| mysql-bin.000002 |  427 | Write_rows  |        11 |         471 | table_id: 70 flags: STMT_END_F                                  |
| mysql-bin.000002 |  471 | Xid         |        11 |         502 | COMMIT /* xid=37 */                                             |
| mysql-bin.000002 |  502 | Query       |        11 |         573 | BEGIN                                                           |
| mysql-bin.000002 |  573 | Table_map   |        11 |         618 | table_id: 70 (yzs.t1)                                           |
| mysql-bin.000002 |  618 | Write_rows  |        11 |         662 | table_id: 70 flags: STMT_END_F                                  |
| mysql-bin.000002 |  662 | Xid         |        11 |         693 | COMMIT /* xid=46 */                                             |
| mysql-bin.000002 |  693 | Query       |        11 |         764 | BEGIN                                                           |
| mysql-bin.000002 |  764 | Table_map   |        11 |         809 | table_id: 70 (yzs.t1)                                           |
| mysql-bin.000002 |  809 | Write_rows  |        11 |         853 | table_id: 70 flags: STMT_END_F                                  |
| mysql-bin.000002 |  853 | Xid         |        11 |         884 | COMMIT /* xid=47 */                                             |
| mysql-bin.000002 |  884 | Query       |        11 |         955 | BEGIN                                                           |
| mysql-bin.000002 |  955 | Table_map   |        11 |        1000 | table_id: 70 (yzs.t1)                                           |
| mysql-bin.000002 | 1000 | Write_rows  |        11 |        1044 | table_id: 70 flags: STMT_END_F                                  |
| mysql-bin.000002 | 1044 | Xid         |        11 |        1075 | COMMIT /* xid=56 */                                             |
| mysql-bin.000002 | 1075 | Query       |        11 |        1199 | use `yzs`; create table t2(id1 int primary key,id2 int,id3 int) |
| mysql-bin.000002 | 1199 | Query       |        11 |        1270 | BEGIN                                                           |
| mysql-bin.000002 | 1270 | Table_map   |        11 |        1316 | table_id: 71 (yzs.t2)                                           |
| mysql-bin.000002 | 1316 | Write_rows  |        11 |        1364 | table_id: 71 flags: STMT_END_F                                  |
| mysql-bin.000002 | 1364 | Xid         |        11 |        1395 | COMMIT /* xid=59 */                                             |
| mysql-bin.000002 | 1395 | Query       |        11 |        1466 | BEGIN                                                           |
| mysql-bin.000002 | 1466 | Table_map   |        11 |        1512 | table_id: 71 (yzs.t2)                                           |
| mysql-bin.000002 | 1512 | Delete_rows |        11 |        1560 | table_id: 71 flags: STMT_END_F                                  |
| mysql-bin.000002 | 1560 | Xid         |        11 |        1591 | COMMIT /* xid=60 */                                             |
| mysql-bin.000002 | 1591 | Query       |        11 |        1662 | BEGIN                                                           |
| mysql-bin.000002 | 1662 | Table_map   |        11 |        1708 | table_id: 71 (yzs.t2)                                           |
| mysql-bin.000002 | 1708 | Write_rows  |        11 |        1756 | table_id: 71 flags: STMT_END_F                                  |
| mysql-bin.000002 | 1756 | Xid         |        11 |        1787 | COMMIT /* xid=63 */                                             |
+------------------+------+-------------+-----------+-------------+-----------------------------------------------------------------+
34 rows in set (0.00 sec)

3.1 insert
mysqlbinlog工具看到的日志:

# at 1316
#180324 23:03:59 server id 11  end_log_pos 1364 CRC32 0xb23b2d4f    Write_rows: table id 71 flags: STMT_END_F  

BINLOG ‘
zzu3WhMLAAAALgAAACQFAAAAAEcAAAAAAAEAA3l6cwACdDIAAwMDAwAGU9yKKQ==
zzu3Wh4LAAAAMAAAAFQFAAAAAEcAAAAAAAEAAgAD//gBAAAAAQAAAAEAAABPLTuy
‘/*!*/;
### INSERT INTO `yzs`.`t2`
### SET
###   @1=1 /* INT meta=0 nullable=0 is_null=0 */
###   @2=1 /* INT meta=0 nullable=1 is_null=0 */
###   @3=1 /* INT meta=0 nullable=1 is_null=0 */
# at 1364  


------公有事件头-----

1)timestamp:cf 3b b7 5a,4个字节

2)event_type:1e,1个字节,WRITE_ROWS_EVENT = 30

3)server-id:0b 00 00 00,4个字节即11

4)event_size:30 00 00 00,4个字节,即该event总大小是48字节

5)next-log pos:54 05 00 00,4个字节,即下一个log的位置是1364字节位置

6)flag:00 00

-------私有事件头------

7)table ID:47 00 00 00 00 00,6个字节,即71

8)flag:01 00,2个字节,可以包含以下信息。该事件是否是语句的最后一个事件,是否需要进行外键约束检查,针对innodb的二级索引是否需要进行唯一性检查,该事件是否包含了完整一行数据也就是说覆盖了所有列。

9)Var-size header len:02 00

10)RW_V_EXTRAINFO_TAG、m_extra_row_data:没有

---------事件体---------

11)列个数:03,即3个列

12)columns-present-bitmap:ff,包含了所有列的数据

13)null-bitmap:f8,即1111 1000,即3个列都不是NULL

14)列值:01 00 00 00 01 00 00 00 01 00 00 00,即3个列的值是1,1,1

15)checksum:4f 2d 3b b2

2.2 delete

# at 1512
#180325  0:19:45 server id 11  end_log_pos 1560 CRC32 0xc6b58a5e    Delete_rows: table id 71 flags: STMT_END_F  

BINLOG ‘
kU23WhMLAAAALgAAAOgFAAAAAEcAAAAAAAEAA3l6cwACdDIAAwMDAwAG0hGsLw==
kU23WiALAAAAMAAAABgGAAAAAEcAAAAAAAEAAgAD//gBAAAAAQAAAAEAAABeirXG
‘/*!*/;
### DELETE FROM `yzs`.`t2`
### WHERE
###   @1=1 /* INT meta=0 nullable=0 is_null=0 */
###   @2=1 /* INT meta=0 nullable=1 is_null=0 */
###   @3=1 /* INT meta=0 nullable=1 is_null=0 */
# at 1560  


和insert的类型差不多,这里只看最后存的值:

f8 01 00 00 00 01 00 00 00 01 00 00 00

即存储的是delete的行值。

update类似,就不再使用案例讲解,感兴趣的可以按照格式解析。

原文地址:http://blog.51cto.com/yanzongshuai/2090894

时间: 2024-10-03 07:58:52

解析MySQL binlog --(5)ROWS_EVENT:WRITE_ROWS_EVENT、UP的相关文章

解析MySQL binlog --(2)FORMAT_DESCRIPTION_EVENT

该格式描述事件时binlog version 4中为了取代之前版本的START_EVENT_3事件而引入的.是binlog文件的第一个事件,并在一个binlog文件中仅出现一次.具体定义:binlog-version:binlog版本mysql-server version:服务器版本create timestamp:指明binlog文件的创建时间.如果该binlog是由于切换产生,那么该字段是0event header length:189event type header lengths:记

腾讯工程师带你深入解析 MySQL binlog

欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 本文由 腾讯云数据库内核团队 发布在云+社区 1.概述 binlog是Mysql sever层维护的一种二进制日志,与innodb引擎中的redo/undo log是完全不同的日志:其主要是用来记录对mysql数据更新或潜在发生更新的SQL语句,并以"事务"的形式保存在磁盘中: 作用主要有: 复制:MySQL Replication在Master端开启binlog,Master把它的二进制日志传递给slaves并回放来达到mast

解析MySQL binlog --(1)大致结构及event type

1.简介 binlog以事件的形式记录数据库变更情况.通过执行show binlog events in "binlog file"命令可以查看事件 mysql> show binlog events in "mysql-bin.000002"; +------------------+-----+-------------+-----------+-------------+------------------------------------------

解析MySQL binlog --(3)QUERY_EVENT

一.介绍 QUERY_EVENT事件以文本的形式记录信息.当binlog格式时statement时,执行的语句都存储在QUERY_EVENT中,如下所示: mysql> show binlog events in "mysql-bin.000002"; +------------------+-----+-------------+-----------+-------------+---------------------------------------------+ |

解析MySQL binlog --(4)TABLE_MAP_EVENT

1.简介 row格式的binlog文件中,每个ROW_EVENT之前都有一个TABLE_MAP_EVENT,用于描述表的内部ID和结构定义. mysql> show binlog events in "mysql-bin.000002"; +------------------+-----+-------------+-----------+-------------+---------------------------------------------+ | Log_nam

利用Canal解析mysql binlog日志

一.安装包下载(canal.deployer-x.x.x.tar.gz  官方建议使用1.0.22版本) https://github.com/alibaba/canal/releases 二.解压文件 tar -zxvf canal.deployer-1.0.22.tar.gz -C /app/canal/ 三.修改canal配置文件 vim $CANAL_HOME/conf/canal.properties vim $CANAL_HOME/conf/example/instance.prop

mysql binlog解析概要

1,dump协议: 根据数据库的ip+port创建socket,如果创建成功,说明链接建立成功,接下来是使用dump协议订阅binlog 链接建立成功之后,服务端会主动向客户端发送如下问候信息greeting(可以理解为经java转换后,是一个java对象), 在下面的代码中可以看到greeting中的信息: this.context.setServerStatus(greeting.getServerStatus());//this.context.setServerVersion(greet

PHP Client for Mysql Binlog

PHP解析Mysql Binlog,依赖于mysql-replication-listener库 详见:https://github.com/bullsoft/php-binlog Install MySQL Replication Listener https://github.com/bullsoft/mysql-replication-listener/archive/master.zip 该源代码,有一处bug,在 tcp_driver.cpp 第 650 行处: int Binlog_

[转]mysql binlog in realtime

原文:http://guweigang.com/blog/2013/11/18/mysql-binlog-in-realtime/ 众所周知,MySQL是最受欢迎的互联网数据库(没有之一)———————为开源而生.发展初期,很多公司都受益于其易用性和经济性.随着这些公司的成长,越来越多的公司投入到MySQL的开发中,因此MySQL的特性也越来越丰富,如:不同特性的存储引擎.Binlog主从复制方案等. 今天我们要探讨的就是如何实时解析MySQL Binlog,以及其所带来的巨大的业务价值.我可以