vc-mysql-sniffer统计MySQL的SQL分布

Posted Atlas

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vc-mysql-sniffer统计MySQL的SQL分布相关的知识,希望对你有一定的参考价值。

有时候我们需要统计线上的SQL执行情况,比如想知道哪条SQL执行最频繁,我们可以开启general_log,然后进行统计,但是general_log开启非常损耗性能,那么我们可以使用vc-mysql-sniffer来代替,改工具是编译好的二进制,下载即可使用。下载地址:

https://www.vividcortex.com/resources/network-analyzer-for-mysql

我这里修改了网上的一个脚本,分析vc-mysql-sniffer抓取到的结果统计频繁执行的SQL。

#!/usr/bin/python
#coding:utf8
# python analysis-vc-log.py 3315 | sort | uniq -c | sort -nr |head -n 10

import re
import sys
import os
import commands

vc_sniffer_time=5
port=sys.argv[1]
vc_cmd=""" /usr/bin/timeout %s  /data/software/vc-mysql-sniffer -binding="[::]:%s"  > /tmp/tmp_vc_mysql_%s.txt """ % (vc_sniffer_time,port,port)
outtext = commands.getoutput(vc_cmd)
cmd=""" grep -Ev ‘# Time:|# [email protected]‘ /tmp/tmp_vc_mysql_%s.txt |sed ‘s/# Query_time.*/myxxxxx/g‘ |awk BEGIN{RS=EOF}‘{gsub(/\\n/," ");print}‘|awk BEGIN{RS=EOF}‘{gsub(/myxxxxx/,"\\n");print}‘ >/tmp/vc_mysql_%s.tx
t""" % (port,port)
outtext = commands.getoutput(cmd)
file="/tmp/vc_mysql_%s.txt" % (port)

logFo = open(file)
for line in logFo:
    line = re.sub(r"\n","",line)
    lineMatch = re.match(r".*",line)
    if lineMatch:
        lineTmp = lineMatch.group(0)
        # remove extra space
        lineTmp = re.sub(r"\s+", " ",lineTmp)
        # replace values (value) to values (x)
        lineTmp = re.sub(r"values\s*\(.*?\)", "values (x)",lineTmp)
        # replace filed = ‘value‘ to filed = ‘x‘
        lineTmp = re.sub(r"(=|>|<|>=|<=)\s*(‘|\").*?\2","\\1 ‘x‘",lineTmp)
        # replace filed = value to filed = x
        lineTmp = re.sub(r"(=|>|<|>=|<=)\s*[0-9]+","\\1 x",lineTmp)
        # replace like ‘value‘ to like ‘x‘
        lineTmp = re.sub(r"like\s+(‘|\").*?\1","like ‘x‘",lineTmp)
        # replace in (value) to in (x)
        lineTmp = re.sub(r"in\s+\(.*?\)","in (x)",lineTmp)
        # replace limit x,y to limit
        lineTmp = re.sub(r"limit.*","limit",lineTmp)
        print lineTmp

logFo.close()
python analysis-vc-log.py 3310 | sort | uniq -c | sort -nr |head -n 10

抓取mysql 3310端口,统计执行最频繁的10条SQL。结果我这里就不贴上来了。有兴趣的同学自己测试。

 

参考资料:

https://www.centos.bz/2015/02/analysis-mysql-general-log/

以上是关于vc-mysql-sniffer统计MySQL的SQL分布的主要内容,如果未能解决你的问题,请参考以下文章

mysql某些值统计

MySQL 分组统计并列出百分比

2019年最新全国省市区街道共46462条数据(统计局MySQL数据库)

mysql的子查询中有统计语句 我该如何优化

shell做统计发邮件

MySQL基本查询示例