​Binlog中,除了具体的SQL,其实,还包含了很多有价值的信息,如,

  1. 事务的开始时间。
  2. 事务的结束时间。
  3. 事务的开始位置点。
  4. 事务的结束位置点。
  5. 操作的开始时间(一个事务通常会包含多个操作)。
  6. 表的操作信息,如哪些表执行了哪些操作。

拿到上面这些信息,我们可以做哪些事情呢?

  1. 基于事务的开始位置点和结束位置点,我们可以得到事务的大小。知道了事务的大小,可用来判断它是否为大事务,是否是导致主从延迟的原因。
  2. 基于事务的开始时间和结束时间,我们可以得到事务的持续时间。
  3. 通过分析表的操作信息,可间接定位出线上的热点表。

开发了一个简单的Binlog分析工具-binlog_summary.py,可提取上面这些信息,并在此基础上,进行一些常见分析。

1. 下载地址

https://github.com/slowtech/dba-toolkit/blob/master/MySQL/binlog_summary.py

2. 参数解析

# python binlog_summary.py --help
usage: binlog_summary.py [-h] [-f BINLOG_TEXT_FILE] [--new]
[-c {tps,opr,transaction}] [--start START_DATETIME]
[--stop STOP_DATETIME] [--sort SORT_CONDITION] [-e]
[--limit LIMIT] optional arguments:
-h, --help show this help message and exit
-f BINLOG_TEXT_FILE, --file BINLOG_TEXT_FILE
Binlog text file, not the Raw binary file
--new Make a fresh start
-c {tps,opr,transaction}, --command {tps,opr,transaction}
Command type: [tps, opr, transaction],tps: transaction
per second, opr: dml per table, transaction: show
transaction info
--start START_DATETIME
Start datetime, for example: 2004-12-25 11:25:56
--stop STOP_DATETIME Stop datetime, for example: 2004-12-25 11:25:56
--sort SORT_CONDITION
Sort condition: time or size, you can use it when
command type is transaction
-e, --extend Show transaction info in detail,you can use it when
command type is transaction
--limit LIMIT Limit the number of rows to display

其中,

  • -f:Binlog通过mysqlbinlog解析后的文本文件。注意,是文本文件,不是Binlog原始文件。使用mysqlbinlog解析时,建议指定-v(显示Pseudo SQL,即伪SQL)和--base64-output=decode-rows(不会显示Base64的编码结果)这两个参数,这样,生成的文本文件才是最小的,相应地,binlog_summary.py解析起来也是最快的。具体命令如下:

    # mysqlbinlog --base64-output=decode-rows -v mysql-bin.000001 > /tmp/mysql-bin.000001.txt
  • --new:工具的分析结果默认是存储在sqlite3数据库中。如果指定了--new,会删除之前创建的sqlite3数据库。注意,在对一个新的Binlog进行分析时需指定该参数。

  • -c:指定命令的类型。支持的命令类型有:

    • tps:分析实例的TPS信息。
    • opr:分析表的操作情况。
    • transaction:分析事务信息。
  • --start:开始时间。分析指定时间段的日志。

  • --stop:结束时间。

  • --sort:排序条件。当命令类型是transaction时,默认是按照事务的执行顺序输出的,可指定size,按事务大小排序,也可指定time,按事务的持续时间排序。

  • -e:当命令类型是transaction时,指定该参数会输出每个事务的详细操作信息。

  • --limit:限制输出的行数。

3. 常见用法

3.1 分析实例的TPS信息

# python binlog_summary.py -f /tmp/mysql-bin.000001.txt -c tps --limit 5
COMMIT_TIME TPS
2021-04-17 08:12:14 1
2021-04-17 08:12:15 7
2021-04-17 08:12:16 12
2021-04-17 08:12:17 12
2021-04-17 08:12:18 9            

注意,这里的TPS是基于事务的提交时间来统计的。

如此细粒度的TPS信息,只能通过Binlog来获取。一般的监控很难做到这一点。

如果要对TPS进行排序,可通过管道 + sort,如,

# python binlog_summary.py -f /tmp/mysql-bin.000001.txt -c tps | sort -k 3 -n 

其中,-k 3是对第三列进行排序,-n是按照数值(默认是字符)的大小进行排序,也可指定-r参数,反向排序。

3.2 分析表的操作情况

# python binlog_summary.py -f /tmp/mysql-bin.000001.txt -c opr --limit 5
TABLE_NAME DML_TYPE NUMS
sbtest.sbtest4 INSERT 609526
sbtest.sbtest6 INSERT 543658
sbtest.sbtest2 INSERT 309701
sbtest.sbtest7 INSERT 309651
sbtest.sbtest5 INSERT 309606       

这里的NUMS是执行次数。

3.3 分析Binlog中最大的5个事务

# python binlog_summary.py -f /tmp/mysql-bin.000001.txt -c transaction --sort size --limit 5
TRANS_NAME BEGIN_TIME COMMIT_TIME BEGIN_LOG_POS COMMIT_LOG_POS DURATION_TIME SIZE
t62562 2021-04-17 08:30:01 2021-04-17 08:32:31 734265229 867878401 150 133613172
t62561 2021-04-17 08:29:19 2021-04-17 08:29:19 677048698 734265148 0 57216450
t62563 2021-04-17 08:33:26 2021-04-17 08:33:50 867878482 925094932 24 57216450
t62564 2021-04-17 08:34:21 2021-04-17 08:34:21 925095013 971504525 0 46409512
t62565 2021-04-17 08:34:58 2021-04-17 08:34:58 971504606 1016178117 0 44673511  

其中,

  • TRANS_NAME:事务编号。
  • BEGIN_TIME:事务开始时间。
  • COMMIT_TIME:事务提交时间。
  • BEGIN_LOG_POS:事务的开始位置点。
  • COMMIT_LOG_POS:事务的结束位置点。
  • DURATION_TIME:事务的持续时间,单位秒。其中,DURATION_TIME = COMMIT_TIME - BEGIN_TIME。
  • SIZE:事务的大小,单位字节,其中,SIZE = COMMIT_LOG_POS - BEGIN_LOG_POS。

拿到事务的大小,我们可以粗略地判断这个Binlog中是否存在大事务。如果要进一步分析事务中包含哪些操作,需加上--extend,如,

# python binlog_summary.py -f /tmp/mysql-bin.000001.txt -c transaction --sort size --extend --limit 5
TRANS_NAME BEGIN_TIME COMMIT_TIME BEGIN_LOG_POS COMMIT_LOG_POS DURATION_TIME SIZE
t62562 2021-04-17 08:30:01 2021-04-17 08:32:31 734265229 867878401 150 133613172
├── sbtest.sbtest2 DELETE 200000
├── sbtest.sbtest3 UPDATE 100000
├── sbtest.sbtest4 INSERT 300000
t62561 2021-04-17 08:29:19 2021-04-17 08:29:19 677048698 734265148 0 57216450
├── sbtest.sbtest1 DELETE 300000
t62563 2021-04-17 08:33:26 2021-04-17 08:33:50 867878482 925094932 24 57216450
├── sbtest.sbtest6 DELETE 300000
t62564 2021-04-17 08:34:21 2021-04-17 08:34:21 925095013 971504525 0 46409512
├── sbtest.sbtest5 UPDATE 121324
t62565 2021-04-17 08:34:58 2021-04-17 08:34:58 971504606 1016178117 0 44673511
├── sbtest.sbtest6 INSERT 234234

4. 实现思路

binlog_summary.py是分析Binlog经过mysqlbinlog解析后的文本文件。具体来说,

  1. 逐行分析解析后的文本。

    为了保证分析的高效,只会分析含有以下关键词的行,其它行则直接跳过。

    match_sub_strings=["use", "# at", "server id", "BEGIN", "insert", "delete", "update", "DELETE", "INSERT", "UPDATE","COMMIT"]
    if not any(each_str in line for each_str in match_sub_strings):
    continue
  2. 分析后的基础数据,会存在sqlite3数据库中。为什么要这么设计呢?

    • 基础数据可重复使用。毕竟binlog_summary.py支持多种维度的分析,如果每进行一次分析,都要重新解析一次文本,不够高效也没必要。
    • sqlite3支持SQL。简单的分组聚合还是用SQL比较方便,而且,sqlite3本身就足够轻量级,无需安装部署。同时,Python中通过sqlite3库就可直接操作。

接下来,再来说说,为什么是分析Binlog经过mysqlbinlog解析后的文本文件,而不是基于MySQL复制协议,直接分析Binlog呢?基于MySQL复制协议,这种方式有个弊端,就是通用性不够,每出一个新的版本,都要进行相应的适配。

基于文本来分析,很多人可能会觉得不高效。

实际测试了下,分析一个1G的Binlog,大概3min,也不算慢。

# time mysqlbinlog --base64-output=decode-rows -v mysql-bin.000001 > /tmp/mysql-bin.000001.txt

real    0m28.148s
user 0m13.821s
sys 0m2.588s # time python binlog_summary.py -f /tmp/mysql-bin.000001.txt --new -c tps --limit 1
COMMIT_TIME TPS
2021-04-17 08:12:14 1 real 2m31.682s
user 2m2.253s
sys 0m2.269s
												

Binlog分析利器-binlog_summary.py的更多相关文章

  1. binlog分析方法

    线上处理问题的时候经常遇到业务说写入了但是数据不对,这种情况八成是业务改了之后又改过来了.但是我们需要证据,下面我们就说说简单的binlog分析 工具:mysqlbinlog #-vvv显示明文sql ...

  2. linux文本分析利器awk

    转 快速理解linux文本分析利器awk 原文链接 杜亦舒 性能与架构 awk是什么 如果工作中需要操作linux比较多,那么awk是非常值得学习的 awk是一个极其强大的文本分析工具,把文件逐行的读 ...

  3. 给Clouderamanager集群里安装可视化分析利器工具Hue步骤(图文详解)

    扩展博客 以下,是我在手动的CDH版本,安装Hue. CDH版本大数据集群下搭建Hue(hadoop-2.6.0-cdh5.5.4.gz + hue-3.9.0-cdh5.5.4.tar.gz)(博主 ...

  4. 给Ambari集群里安装可视化分析利器工具Hue步骤(图文详解)

    扩展博客 以下,是我在手动的CDH版本平台下,安装Hue. CDH版本大数据集群下搭建Hue(hadoop-2.6.0-cdh5.5.4.gz + hue-3.9.0-cdh5.5.4.tar.gz) ...

  5. 窗口、消息查看分析利器Spy++

    Spy++ —— 窗口.消息查看分析利器 Spy++ —— 窗口.消息查看分析利器 2016年07月15日 00:25:22 阅读数:23170 1,简介   Microsoft Spy++是一个非常 ...

  6. django源码分析 python manage.py runserver

    django是一个快速开发web应用的框架, 笔者也在django框架上开发不少web应用,闲来无事,就想探究一下django底层到底是如何实现的,本文记录了笔者对django源码的分析过程 I be ...

  7. tornado架构分析3 options.py中基础类_Option

    1 数据清洗 option里面最重要的方法就是parse,在这里,parse函数的一开始就调用了后面的子函数_parse_datetime,_parse_timedelta,_parse_bool,_ ...

  8. tornado架构分析2 options.py实现原理

    总结体会: options这个文件是用来管理程序运行过程中配置的,它采用了单例模式,整个程序运行时只有一个实例存在. 参数可以从命令行读取,也可以从配置文件中读取,就看你怎么用了. 同时,option ...

  9. MySQL 几种调式分析利器

    目录 pstack gdb strace perf pstack 获取堆栈信息 问题线程的定位 负载较低 mysql_pid=4522 pstack $mysql_pid>pstack.info ...

  10. 日志分析利器Splunk的搭建、使用、破解

    博主对splunk的了解不多,博主的使用目的是为了同步,分析日志.当初的搭建也是为了公司申请牌照需要日志服务器分析日志,顺便自己也对这方面感兴趣就买了本书看了看搭建玩的,后来检查来了博主也给他们演示了 ...

随机推荐

  1. 一个神奇的golang技巧:扩大heap内存来降低gc频率

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu 公众号:一本正经的瞎扯 具体的文章请看:https://web.archive.org/web/ ...

  2. 深度学习应用篇-计算机视觉-图像分类[3]:ResNeXt、Res2Net、Swin Transformer、Vision Transformer等模型结构、实现、模型特点详细介绍

    深度学习应用篇-计算机视觉-图像分类[3]:ResNeXt.Res2Net.Swin Transformer.Vision Transformer等模型结构.实现.模型特点详细介绍 1.ResNet ...

  3. Python 实现ARP扫描与欺骗

    ARP欺骗又称ARP毒化或ARP攻击,是针对以太网地址解析协议ARP的一种攻击技术,通过欺骗局域网内访问者PC的网关MAC地址,使访问者PC错以为攻击者更改后的MAC地址是网关的MAC,导致网络不通. ...

  4. 搭建私有仓库Registry(Docker Hub)

    搭建私有仓库Registry(Docker Hub) 安装Docker 拉取仓库镜像:# docker pull registry 生成认证certificate mkdir ~/certs open ...

  5. 在K8S中,集群可以做哪些优化?

    在Kubernetes(简称K8s)集群中,可以进行多种优化以提升性能.稳定性和资源利用率.以下是一些常见的优化措施: 控制面组件优化: kube-apiserver 高可用与扩展:通过配置多个API ...

  6. GJK算法:两个凸集的碰撞测试

      GJK算法用于判断两个凸集是否相交,其中GJK是三个提出者的姓名首字母.为了便于理解(偷懒),下面的内容都只在二维平面内讨论. 1. 回顾凸集   可能有很多小伙伴忘了什么是凸集.凸集有很多等价的 ...

  7. (python)每日代码||2024.1.27||类方法与实例方法

    class test(): aaa = 111 bbb = 222 ccc = 333 @classmethod def cm(cls): cls.aaa="***" def im ...

  8. react 快速接入 sentry,性能监控与错误上报踩坑日记

    壹 ❀ 引 本文是我入职第一个月所写,在主导基建组的这段时间也难免会与错误监控和性能监控打交道,因为公司主要考虑接入sentry,所以对于接入sentry的基建任务也提了一些需求,主要分为: 支持查看 ...

  9. NC13611 树

    题目链接 题目 题目描述 shy有一颗树,树有n个结点.有k种不同颜色的染料给树染色.一个染色方案是合法的,当且仅当对于所有相同颜色的点对(x,y),x到y的路径上的所有点的颜色都要与x和y相同.请统 ...

  10. 使用OpenWrt实现IPv6 DDNS

    OpenWrt 增加 crontab 任务 在/root/crontab/ 目录下, 创建脚本 ddns.sh #!/bin/sh # 远程php脚本的URL地址 SERVICE_URL=http:/ ...