解析MySQL binlog --(3)QUERY_EVENT

一、介绍

QUERY_EVENT事件以文本的形式记录信息。当binlog格式时statement时,执行的语句都存储在QUERY_EVENT中,如下所示:

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 */                          |
+------------------+-----+-------------+-----------+-------------+---------------------------------------------+
5 rows in set (0.00 sec)  

QUERY_EVENT类型的事件通常在一下几个情况中使用:

1、事务开始时,在binlog中有一个QUERY_EVENT类型的BEGIN。

2、在statement格式中,具体执行的SQL语句会保存在该事件中。

3、对于ROW格式的binlog,所有DDL操作以文本的形式记录在该事件中。

二、此事件的格式

三、案例讲解

结合hexdump出来的数据和mysqlbinlog解析出的日志进行分析:

# at 120
#180310 21:53:38 server id 11  end_log_pos 191 CRC32 0xba8c8530     Query   thread_id=1 exec_time=0 error_code=0
SET TIMESTAMP=1520747618/*!*/;
SET @@session.pseudo_thread_id=1/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1073741824/*!*/;
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=33/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 191  

hexdump的日志:

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

1、timestamp:4个字节,62 c4 a4 5a

2、even type:1个字节,02:该类型是QUERY_EVENT= 2,

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

4、event size:4个字节,47 00 00 00,大小即71

5、next-log pos:4个字节,bf 00 00 00.即191

6、flag:2个字节,08 00

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

7、slave_proxy_id:4个字节,01 00 00 00,即thread ID是1.存储了不同连接或会话的线程ID

8、execution time:4个字节,00 00 00 00,查询从开始执行到记录到binlog所花时间,单位s

9、schema length:1个字节,03,schema字符长度。yzs

10、error code:2个字节,00 00,错误码

11、status-var length:2个字节,1a 00,status-var的长度,为26

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

12、status var:26个字节,以KV对的形式保存起来的一些了由SET命令设置的上下文信息。

13、schema:3字节,yzs,当前选择的databases

14、00,默认

15、query:query的文本格式,里面存储的可能是BEGIN、COMMIT字符串或原生的SQL等

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

时间: 2024-11-08 08:45:18

解析MySQL binlog --(3)QUERY_EVENT的相关文章

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

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

解析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 --(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不仅包含行修改后的值,也包括修改前的值:DEL

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

1.简介 binlog以事件的形式记录数据库变更情况.通过执行show binlog events in "binlog file"命令可以查看事件 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,以及其所带来的巨大的业务价值.我可以