原创:转载请说明出处谢谢!

上接

http://blog.itpub.net/7728585/viewspace-2133188/ 解析MYSQL BINLOG 二进制格式(1)--准备工作

http://blog.itpub.net/7728585/viewspace-2133189/ 解析MYSQL BINLOG 二进制格式(2)--FORMAT_DESCRIPTION_EVENT

http://blog.itpub.net/7728585/viewspace-2133321/ 解析MYSQL BINLOG 二进制格式(3)--QUERY_EVENT

http://blog.itpub.net/7728585/viewspace-2133429/ 解析MYSQL BINLOG 二进制格式(4)--TABLE_MAP_EVENT

http://blog.itpub.net/7728585/viewspace-2133463/ 解析MYSQL BINLOG 二进制格式(5)--WRITE_ROW_EVENT

http://blog.itpub.net/7728585/viewspace-2133469/ 解析MYSQL BINLOG 二进制格式(6)--UPDATE_ROW_EVENT/DELETE_ROW_EVENT

http://blog.itpub.net/7728585/viewspace-2133502/ 解析MYSQL BINLOG 二进制格式(7)--Xid_log_event/XID_EVENT

http://blog.itpub.net/7728585/viewspace-2133506/ 解析MYSQL BINLOG二进制格式(8)--GTID_LOG_EVENT/ANONYMOUS_GTID_LOG_EVENT及其他

1、工具原理和作用:

本工具是我通过学习binlog event写的一个能够直接读取binlog二进制文件的工具,使用语言C语言,编译器gcc,

他是通过读取各个主要字节的输出。因为mysqlbinlog输出有时候过于繁杂,infobin工具可以帮助初次定位,结合

mysqlbinlog进行分析,同时写这个工具也是为了验证学习event的正确性。

最后生成一个总的汇总,汇总信息是我最近更新的加入了:

如下部分:

-------------Total now--------------

Trx total[counts]:7665

Event total[counts]:183513

Max trx event size:8193(bytes) Pos:306929600[0X124B5FC0]

Avg binlog size(/sec):609537.375(bytes)[595.251(kb)]

Avg binlog size(/min):36572244.000(bytes)[35715.082(kb)]

--Piece view:

(1)Time:1487126981-1487127083(102(s)) piece:237110047(bytes)[231552.781(kb)]

(2)Time:1487127083-1487127083(0(s)) piece:237110047(bytes)[231552.781(kb)]

(3)Time:1487127083-1487127083(0(s)) piece:237110047(bytes)[231552.781(kb)]

(4)Time:1487127083-1487128812(1729(s)) piece:237110047(bytes)[231552.781(kb)]

(5)Time:1487128812-1487128926(114(s)) piece:237110047(bytes)[231552.781(kb)]

--Large than 1000(bytes) trx:

(1)Trx_size:815352746(bytes)[796242.938(kb)] trx_begin_p:1174606[0X11EC4E] trx_end_p:816527352[0X30AB37F8]

(2)Trx_size:3108(bytes)[3.035(kb)] trx_begin_p:817520533[0X30BA5F95] trx_end_p:817523641[0X30BA6BB9]

(3)Trx_size:3116(bytes)[3.043(kb)] trx_begin_p:817523706[0X30BA6BFA] trx_end_p:817526822[0X30BA7826]

(4)Trx_size:5910(bytes)[5.771(kb)] trx_begin_p:817526887[0X30BA7867] trx_end_p:817532797[0X30BA8F7D]

(5)Trx_size:11538(bytes)[11.268(kb)] trx_begin_p:817532862[0X30BA8FBE] trx_end_p:817544400[0X30BABCD0]

(6)Trx_size:22754(bytes)[22.221(kb)] trx_begin_p:817544465[0X30BABD11] trx_end_p:817567219[0X30BB15F3]

2、限制:

--只能使用在Little_endian上,编译是在LINUX gcc编译的

--load data infile event是没有检测的

--不能读取出row event的语句,因为没有写那么复杂

--可以读取出statement格式的语句,但是为了简洁做了35字节的截断,方便输出

这些东西在mysqlbinlog解析中都有。

3、使用方法和获取

获取可以通过百度云盘

http://pan.baidu.com/s/1jHIWUN0

获得,编译的只有LINUX64版本的

使用帮助如下:

[root@testmy data]# ./infobin

USAGE ERROR!

[Author]: gaopeng [QQ]:22389860 [blog]:http://blog.itpub.net/7728585/

--USAGE:./infobin [binlogfile] [piece] [bigtrxsize]

[binlogfile]:binlog file!

[piece]:how many piece will split,is a Highly balanced histogram,

find which time generate biggest binlog.(must:piece<2000000)

[bigtrxsize](bytes):larger than this size trx will view.(must:trx>256(bytes))

如:./infobin test.000200 5 257

5:代表是piece,这是一个高度均衡直方图的桶数量,后面会看到输出解释

257:是大约257 bytes的事物输出到最后

4、输出解析

我们以MYSQL 5.7 row format格式为例,我做的语句是

mysql> select * from testnull2;

+------+---------+---------+

| id   | name1   | name2   |

+------+---------+---------+

|    1 | gaopeng | gaopeng |

|    1 | gaopeng | gaopeng |

+------+---------+---------+

2 rows in set (0.00 sec)

mysql> create table testtool like testnull2;

Query OK, 0 rows affected (0.26 sec)

mysql> insert into testtool select * from testnull2;

Query OK, 2 rows affected (0.03 sec)

Records: 2  Duplicates: 0  Warnings: 0

使用./infobin test.000200 得到的输出如下:

[root@testmy data]# ./infobin test.000200 5 512

Check is Little_endian

Author: gaopeng QQ:22389860 Mail: gaopp_200217@163.com

Waring: This tool only Little_endian platform!

Little_endian check ok!!!

-------------Now begin--------------

Check Mysql Version is:5.7.13-log

Check Mysql binlog format ver is:V4

Warning:Check This binlog is not closed!

Check This binlog total size:664(bytes)

Note:load data infile not check!

------------Detail now--------------

>Format description log Event:Pos:4(0X4) N_pos:123(0X7b) Time:1487035963 Event_size:119(bytes)

>Previous gtid Event:Pos:123(0X7b) N_pos:194(0Xc2) Time:1487035963 Event_size:71(bytes)

>Gtid Event:Pos:194(0Xc2) N_pos:259(0X103) Time:1487035999 Event_size:65(bytes)

Gtid:4a6f2a67-5d87-11e6-a6bd-0c29a879a3:1100463

-->Query Event:Pos:259(0X103) N_Pos:362(0X16a) Time:1487035999 Event_size:103(bytes)

Exe_time:0  Use_db:test Statment(35b-trun):create table testtool like testnull Gno:1100463

>Gtid Event:Pos:362(0X16a) N_pos:427(0X1ab) Time:1487036014 Event_size:65(bytes)

Gtid:4a6f2a67-5d87-11e6-a6bd-0c29a879a3:1100464

-->Query Event:Pos:427(0X1ab) N_Pos:499(0X1f3) Time:1487036014 Event_size:72(bytes)

Exe_time:0  Use_db:test Statment(35b-trun):BEGIN /*!Trx begin!*/ Gno:1100464

---->Map Event:Pos499(0X1f3) N_pos:556(0X22c) Time:1487036014 Event_size:57(bytes)

TABLE_ID:346 DB_NAME:test TABLE_NAME:testtool Gno:1100464

------>Insert Event:Pos:556(0X22c) N_pos:633(0X279) Time:1487036014 Event_size:77(bytes)

Dml on table: test.testtool  table_id:346 Gno:1100464

>Xid Event:Pos:633(0X279) N_Pos:664(0X298) Time:1487036014 Event_size:31(bytes)

COMMIT; /*!Trx end*/ Gno:1100464

-------------Total now--------------

Trx total[counts]:1

Event total[counts]:10

Max trx event size:119(bytes) Pos:4[0X4]

Avg binlog size(/sec):5.007(bytes)[0.005(kb)]

Avg binlog size(/min):300.426(bytes)[0.293(kb)]

--Piece view:

(1)Time:1487035963-1487035999(36(s)) piece:141(bytes)[0.138(kb)]

(2)Time:1487035999-1487036014(15(s)) piece:141(bytes)[0.138(kb)]

(3)Time:1487036014-1487036014(0(s)) piece:141(bytes)[0.138(kb)]

(4)Time:1487036014-1487036014(0(s)) piece:141(bytes)[0.138(kb)]

(5)Time:1487036014-1487036104(90(s)) piece:141(bytes)[0.138(kb)]

--Large than 257(bytes) trx:

No trx find!

now begin部分:

一目了然需要说明一点Warning:Check This binlog is not closed!说明这个binlog是当前正在使用binlog

这个和mysqlbinlog

# at 4

#170214  9:32:43 server id 93157  end_log_pos 123 CRC32 0xc5518ba9      Start: binlog v 4, server v 5.7.13-log created 170214  9:32:43

# Warning: this binlog is either in use or was not closed properly.

中是一个意思

Detail now部分:

*1、event都以>开始,但是一个事物的event我使用--> ----> ------->来进行区别化更加利于阅读,如果

仔细研究过event这些event一定不会陌生

*2、

Pos:当前event位置

N_pos:下一个event位置,

Gtid: 当然就是GTID如果是匿名事物就是ANONYMOUS 其GTID为0

Time:新纪元时间以来的秒数 可以用LINUX命令换算 如:date -s "@1487035999"

Event_size:这个event有多大

Gno:gtid的事物号部分,我用来标示它们是一个事物

TABLE_ID:是行格式特有的,这个用来保证slave复制的正确性

Use_db: use database 默认当前在哪个数据下,是query event特有的

DB_NAME: 这是map event特有的,也是行格式特有的,记录的是表所在的数据库,和Use_db有区别,

Statment(35b-trun):在query event中记录的语句为了方便输出将语句做35字节阶段

/*!Trx begin!*/:表示这是一个事物的开始,如果是gtid模式需要向前推一个event,因为gtid event也算到事物中

/*!Trx end*/:自然就是事物的结束点

mysqlbinlog中也是一致的比如:

>Gtid Event:Pos:194(0Xc2) N_pos:259(0X103) Time:1487035999 Event_size:65(bytes)

Gtid:4a6f2a67-5d87-11e6-a6bd-0c29a879a3:1100463

[root@testmy ~]# date -s "@1487035999"

Tue Feb 14 09:33:19 CST 2017

对应mysqlbinlog的如下部分:

# at 194

#170214  9:33:19 server id 93157  end_log_pos 259 CRC32 0xb664a0c6      GTID [commit=yes]

SET @@SESSION.GTID_NEXT= '4a6f2a67-5d87-11e6-a6bd-000c29a879a3:1100463'/*!*/;

关于 TABLE_ID Use_db DB_NAME 必须着重说明:

在语句模式下:

use mysql

insert into test.testtool select * from test.testnull2;

这种语句和salve 端--replicate-do-db 类参数一起出现可能呢出现问题,因为语句模式只有query event 而没有map event,

导致过滤的时候这种语句因为它是在mysql下:

如下:

>Gtid Event:Pos:800(0X320) N_pos:865(0X361) Time:1487036301 Event_size:65(bytes)

Gtid:4a6f2a67-5d87-11e6-a6bd-0c29a879a3:1100467

-->Query Event:Pos:865(0X361) N_Pos:945(0X3b1) Time:1487036301 Event_size:80(bytes)

Exe_time:0  Use_db:mysql Statment(35b-trun):BEGIN /*!Trx begin!*/ Gno:1100467

-->Query Event:Pos:945(0X3b1) N_Pos:1074(0X432) Time:1487036301 Event_size:129(bytes)

Exe_time:0  Use_db:mysql Statment(35b-trun):insert into test.testtool select *  Gno:1100467

>Xid Event:Pos:1074(0X432) N_Pos:1105(0X451) Time:1487036301 Event_size:31(bytes)

COMMIT; /*!Trx end*/ Gno:1100467

注意这里Use_db:mysql

同样的语句在row格式下:

>Gtid Event:Pos:497(0X1f1) N_pos:562(0X232) Time:1487036269 Event_size:65(bytes)

Gtid:4a6f2a67-5d87-11e6-a6bd-0c29a879a3:1100466

-->Query Event:Pos:562(0X232) N_Pos:635(0X27b) Time:1487036269 Event_size:73(bytes)

Exe_time:0  Use_db:mysql Statment(35b-trun):BEGIN /*!Trx begin!*/ Gno:1100466

---->Map Event:Pos635(0X27b) N_pos:692(0X2b4) Time:1487036269 Event_size:57(bytes)

TABLE_ID:346 DB_NAME:test TABLE_NAME:testtool Gno:1100466

------>Insert Event:Pos:692(0X2b4) N_pos:769(0X301) Time:1487036269 Event_size:77(bytes)

Dml on table: test.testtool  table_id:346 Gno:1100466

>Xid Event:Pos:769(0X301) N_Pos:800(0X320) Time:1487036269 Event_size:31(bytes)

COMMIT; /*!Trx end*/ Gno:1100466

注意Use_db:mysql DB_NAME:test Dml on table: test.testtool ,记录的正确性就是table id联系的。

这也保证row格式下复制的正确性

但是DDL语句始终是statement模式。

这一点在MYSQL 官方文档也有说明:

Statement-based replication.  Tell the slave SQL thread to restrict replication to statements where

the default database (that is, the one selected by USE) is db_name. To specify more than one database,

use this option multiple times, once for each database; however, doing so does notreplicate crossdatabase statements

such as UPDATE some_db.some_tableSET foo='bar'while a different

database (or no database) is selected.

Warning

To specify multiple databases you mustuse multiple instances of this option.

Because database names can contain commas, if you supply a comma

separated list then the list will be treated as the name of a single database.

An example of what does not work as you might expect when using statement-based replication: If

the slave is started with --replicate-do-db=salesand you issue the following statements on the

master, the UPDATE statement is not replicated:

USE prices;

UPDATE sales.january SET amount=amount+1000;

The main reason for this “check just the default database”behavior is that it is difficult from the statement

alone to know whether it should be replicated (for example, if you are using multiple-table DELETE

statements or multiple-table UPDATEstatements that act across multiple databases). It is also faster to

check only the default database rather than all databases if there is no need.

*3、如何辨别是一个事物

这就是row模式下的一个事物(算上GTID生成event):

>Gtid Event:Pos:362(0X16a) N_pos:427(0X1ab) Time:1487036014 Event_size:65(bytes)

Gtid:4a6f2a67-5d87-11e6-a6bd-0c29a879a3:1100464

-->Query Event:Pos:427(0X1ab) N_Pos:499(0X1f3) Time:1487036014 Event_size:72(bytes)

Exe_time:0  Use_db:test Statment(35b-trun):BEGIN /*!Trx begin!*/ Gno:1100464

---->Map Event:Pos499(0X1f3) N_pos:556(0X22c) Time:1487036014 Event_size:57(bytes)

TABLE_ID:346 DB_NAME:test TABLE_NAME:testtool Gno:1100464

------>Insert Event:Pos:556(0X22c) N_pos:633(0X279) Time:1487036014 Event_size:77(bytes)

Dml on table: test.testtool  table_id:346 Gno:1100464

>Xid Event:Pos:633(0X279) N_Pos:664(0X298) Time:1487036014 Event_size:31(bytes)

COMMIT; /*!Trx end*/ Gno:1100464

这是statement模式下的一个事物(算上GTID生成event):

>Gtid Event:Pos:800(0X320) N_pos:865(0X361) Time:1487036301 Event_size:65(bytes)

Gtid:4a6f2a67-5d87-11e6-a6bd-0c29a879a3:1100467

-->Query Event:Pos:865(0X361) N_Pos:945(0X3b1) Time:1487036301 Event_size:80(bytes)

Exe_time:0  Use_db:mysql Statment(35b-trun):BEGIN /*!Trx begin!*/ Gno:1100467

-->Query Event:Pos:945(0X3b1) N_Pos:1074(0X432) Time:1487036301 Event_size:129(bytes)

Exe_time:0  Use_db:mysql Statment(35b-trun):insert into test.testtool select *  Gno:1100467

>Xid Event:Pos:1074(0X432) N_Pos:1105(0X451) Time:1487036301 Event_size:31(bytes)

COMMIT; /*!Trx end*/ Gno:1100467

Total now 部分:

Trx total[counts]:1 总的事物个数

Event total[counts]:10 总的event个数

Avg binlog size(/sec):5.007(bytes)[0.005(kb)]

Avg binlog size(/min):300.426(bytes)[0.293(kb)]

平均每秒每分生成的binlog大小

--Piece view:

(1)Time:1487035963-1487035999(36(s)) piece:141(bytes)[0.138(kb)]

(2)Time:1487035999-1487036014(15(s)) piece:141(bytes)[0.138(kb)]

(3)Time:1487036014-1487036014(0(s)) piece:141(bytes)[0.138(kb)]

(4)Time:1487036014-1487036014(0(s)) piece:141(bytes)[0.138(kb)]

(5)Time:1487036014-1487036104(90(s)) piece:141(bytes)[0.138(kb)]

根据指定piece大小得到一个高度均衡直方图,这个直方图用于发现是否有某个时间段生成binlog特别大,

如上明显1487036014这个时间的event 比较多,可能是大事物。

--Large than 257(bytes) trx:

Node trx find!

大约257 BYTES个事务,这里测试的没有如果有如下:

--Large than 1000(bytes) trx:

(1)Trx_size:815352746(bytes)[796242.938(kb)] trx_begin_p:1174606[0X11EC4E] trx_end_p:816527352[0X30AB37F8]

(2)Trx_size:3108(bytes)[3.035(kb)] trx_begin_p:817520533[0X30BA5F95] trx_end_p:817523641[0X30BA6BB9]

(3)Trx_size:3116(bytes)[3.043(kb)] trx_begin_p:817523706[0X30BA6BFA] trx_end_p:817526822[0X30BA7826]

(4)Trx_size:5910(bytes)[5.771(kb)] trx_begin_p:817526887[0X30BA7867] trx_end_p:817532797[0X30BA8F7D]

(5)Trx_size:11538(bytes)[11.268(kb)] trx_begin_p:817532862[0X30BA8FBE] trx_end_p:817544400[0X30BABCD0]

(6)Trx_size:22754(bytes)[22.221(kb)] trx_begin_p:817544465[0X30BABD11] trx_end_p:817567219[0X30BB15F3]

(7)Trx_size:45226(bytes)[44.166(kb)] trx_begin_p:817567284[0X30BB1634] trx_end_p:817612510[0X30BBC6DE]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7728585/viewspace-2133534/,如需转载,请注明出处,否则将追究法律责任。

mysql binlog解析 c_解析MYSQL BINLOG二进制格式(9)--infobin解析binlog帮助文档相关推荐

  1. c#erp项目源码 mysql_Jsp+Ssm+Mysql实现图书馆预约占座管理系统项目源码(可带论文文档)...

    JSP+SSM+MYSQL实现图书馆预约占座管理系统项目源码(可带论文文档). 一款ssm图书馆预约占座管理系统,此系统有论文文档,需单独购买,此商品只为项目源码. 提前预定的好处:一开始我们这边有大 ...

  2. mysql 5.5.安装包_完美!阿里内部MySQL笔记爆火,肝完不再删库到跑路!(文档+视频贼全!)...

    MySQL凭借着它还不错的性能.还不错的稳定性常年稳居老二宝座,当然最大的优势就是它不要钱,还开源,这让它成为大部分中小型公司,尤其是互联网公司首选的数据库(近年来越来越多的大公司也在尝试将业务转移到 ...

  3. mysql课程设计实习指导书_MYSQL课程设计实习指导书【精品文档系列】.pdf

    MYSQL课程设计指导书 一.课程设计题目 教务管理系统设计 二.课程设计的目的和意义 教务管理系统是学校管理信息系统建设的重要组成部分, 是提高教学管理的质量和效果的关键环节. 教学教务信息处理的电 ...

  4. MYSQL命令之问号?的用法、利用问号查看指导帮助或文档

    MYSQL命令之问号?的用法.利用问号?contents 查看文档帮助 MYSQL之问号 ? 前提:用命令 mysql -uroot -proot 登录成功 输入一个问号 ? 展示相关提示帮助 输入 ...

  5. 解析MYSQL BINLOG二进制格式(10)--问题解答

    原创转发请注明出处 上接 http://blog.itpub.net/7728585/viewspace-2133188/ 解析MYSQL BINLOG 二进制格式(1)--准备工作  http:// ...

  6. 3_HEIF/heic格式图片文件解析(20190107)

    3_HEIF/heic格式图片文件解析(20190107) HEIF/heic格式图片文件解析(20190107) 文章目录 参考: https://zhuanlan.zhihu.com/p/3466 ...

  7. 将XML解析成DOM文档

    在支持html5的浏览其中,可以使用标准解析器DOMParser对象进行解析html或者xml等字符串 var data = '<div></div>'; var tmp = ...

  8. mysql 高级知识点_这是我见过最全的《MySQL笔记》,涵盖MySQL所有高级知识点!...

    作为运维和编程人员,对MySQL一定不会陌生,尤其是互联网行业,对MySQL的使用是比较多的.MySQL 作为主流的数据库,是各大厂面试官百问不厌的知识点,但是需要了解到什么程度呢?仅仅停留在 建库. ...

  9. sql alwayson群集 registerallprovidersip改为0_技术分享 | 从 MySQL 8.0 复制到 MySQL 5.7

    作者:Vinicius Grippa 本文中,我们将讨论如何设置从 MySQL 8.0 到 MySQL 5.7 的复制.在某些情况下,使用此配置可能会有所帮助.例如,在 MySQL 升级的情况下,将使 ...

最新文章

  1. form表单会跨域_前端跨域So Easy
  2. keras 时间序列分析
  3. js代码收集(1)_隐藏div、table间隔样式设置
  4. 使用CreateFile函数打开COM10及以上串行口
  5. 如何看创建媒体日期_每天约4万个网约车投诉,看AI如何接招_媒体_澎湃新闻
  6. 选择“关机”还是“睡眠”?
  7. 程序员如何用gRPC谈一场恋爱
  8. 如何通过JNI在Java中调用C库函数
  9. 整理Java基础知识--NumberMath类
  10. 谈谈软件工程与计算机科学的区别
  11. mysql 事务 注意 优化_MySQL入门详解(二)---mysql事务、锁、以及优化
  12. Quartz定时任务
  13. 微信小游戏引擎插件,Creator 使用教程!
  14. 排序链表(归并排序)
  15. CF106C Buns动态规划解决多重背包
  16. STM32实现基于I2C的AHT20温湿度采集
  17. 笔记本打开腾讯会议显示未检测到可用摄像头,但是系统自带相机可以使用
  18. GlusterFS简介
  19. EGE基础入门篇(九):双缓冲与手动渲染
  20. EMI(干扰)和EMS(产品抗干扰和敏感度)。

热门文章

  1. leetcode @python 124. Binary Tree Maximum Path Sum
  2. careercup-数学与概率 7.7
  3. CodeForces 214B Hometask
  4. 拖动窗体FormBorderStyle属性为None的窗体移动
  5. 两个大整数相乘 C++ 版本 源码
  6. 抖音申请企业蓝v认证的流程是怎样的?
  7. 【7.9校内test】T1挖地雷
  8. 【js】实现 鼠标按下并未松开 事件
  9. Xcode字体新宠 Monoid
  10. Mysql Explain用法pdf