本文来自:https://github.com/Qihoo360/mysql-sniffer

简介

MySQL Sniffer 是一个基于 MySQL 协议的抓包工具,实时抓取 MySQLServer 端的请求,并格式化输出。输出内容包访问括时间、访问用户、来源 IP、访问 Database、命令耗时、返回数据行数、执行语句等。有批量抓取多个端口,后台运行,日志分割等多种使用方式,操作便捷,输出友好。同时也适用抓取 Atlas 端的请求,Atlas 是奇虎开源的一款基于MySQL协议的数据中间层项目,项目地址:https://github.com/Qihoo360/Atlas同类型工具还有vc-mysql-sniffer,以及 tshark 的 -e mysql.query 参数来解析 MySQL 协议。

使用

下载:github 地址:https://github.com/Qihoo360/mysql-sniffer

安装:

1)安装依赖包:

Centos

yum install cmake
yum install libpcap-devel
yum install glib2-devel
yum install libnet-devel

Ubuntu:

apt-get install cmake
apt-get install libpcap-dev
apt-get install glib2.-dev
apt-get install libnet-dev
apt-get install build-essential

2)下载安装

git clone https://github.com/Qihoo360/mysql-sniffer.git
cd mysql-sniffer
mkdir proj
cd proj
cmake ../
make

在bin目录下面生成了:
mysql-sniffer

若在ubuntu安装的时候报错:

/usr/include/glib-2.0/glib/gtypes.h::: fatal error: glibconfig.h: No such file or directory

则需要:

cp /usr/lib/x86_64-linux-gnu/glib-2.0/include/glibconfig.h /usr/include/glib-2.0/

如果在make的时候报错:

/bin/ld: /root/mysql-sniffer/lib/libgthread-2.0.a(gthread-impl.o): undefined reference to symbol 'pthread_setspecific@@GLIBC_2.2.5'
/usr/lib64/libpthread.so.: error adding symbols: DSO missing from command line
collect2: error: ld returned exit status

原因是pthread 库不是 Linux 系统默认的库,连接时需要使用静态库 libpthread.a,所以在使用pthread_create()创建线程,以及调用 pthread_atfork()函数建立fork处理程序时,需要链接该库。所以在编译中要加 -lpthread参数。

通过查找rdynamic关键字找到文件proj/bin/CMakeFiles/mysql-sniffer.dir/link.txt,并在最后添加了-lpthread,重新make后成功。

/bin/c++  -DENABLE_TCPREASM -O3 -Wall  -DENABLE_TCPREASM -O2  -rdynamic CMakeFiles/mysql-sniffer.dir/main.c.o CMakeFiles/mysql-sniffer.dir/mysql-dissector.c.o CMakeFiles/mysql-sniffer.dir/util.c.o CMa    keFiles/mysql-sniffer.dir/session.cpp.o CMakeFiles/mysql-sniffer.dir/sniff-config.cpp.o CMakeFiles/mysql-sniffer.dir/sniff-log.cpp.o  -o mysql-sniffer  -L/root/mysql-sniffer/lib -Wl,-rpath,/root/mysql    -sniffer/lib -Wl,-Bstatic -lnidstcpreasm -lnet -lpcap -lglib-2.0 -lgthread-2.0 -Wl,-Bdynamic -lrt -Wl,-Bstatic -lnet -lpcap -lglib-2.0 -lgthread-2.0 -Wl,-Bdynamic -lrt -lpthread

参数说明:

 root@db-test2:~# mysql-sniffer -h
Usage mysql-sniffer [-d] -i eth0 -p ,, -l /var/log/mysql-sniffer/ -e stderr
[-d] -i eth0 -r -
-d daemon mode. #
-s how often to split the log file(minute, eg. ). if less than , split log everyday
-i interface. Default to eth0 #网卡名
-p port, default to . Multiple ports should be splited by ','. eg. ,
this option has no effect when -f is set. #端口,多个端口,分割,不能和-f一起使用
-r port range, Don't use -r and -p at the same time #端口范围,不能和-p一起使用
-l query log DIRECTORY. Make sure that the directory is accessible. Default to stdout. #输出打印到文件
-e error log FILENAME or 'stderr'. if set to /dev/null, runtime error will not be recorded
-f filename. use pcap file instead capturing the network interface
-w white list. dont capture the port. Multiple ports should be splited by ','.#排除的端口
-t truncation length. truncate long query if it's longer than specified length. Less than 0 means no truncation #截取制定长度的SQL
-n keeping tcp stream count, if not set, default is . if active tcp count is larger than the specified count, mysql-sniffer will remove the oldest one #指定数据包个数

示例

输出格式:时间,访问用户,来源 IP,访问 Database,命令耗时,返回数据行数,执行语句。

1. 实时抓取某端口信息并打印到屏幕:-i 指定网卡名,-p 指定抓取的端口

[root@localhost ~]# mysql-sniffer -i enp3s0 -p 
-- :: zhoujy 192.168.200.64 NULL 0ms select @@version_comment limit
-- :: zhoujy 192.168.200.64 NULL 0ms select USER()
-- :: zhoujy 192.168.200.64 NULL 0ms SELECT DATABASE()
-- :: zhoujy 192.168.200.64 xx 0ms use xx
-- :: zhoujy 192.168.200.64 xx 0ms select * from xx
-- :: zhoujy 192.168.200.64 xx 0ms select user,host from mysql.user
-- :: zhoujy 192.168.200.64 xx 0ms show grants for root@localhost
-- :: zhoujy 192.168.200.64 xx 18ms select now()
-- :: zhoujy 192.168.200.64 xx 32ms select +

2. 实时抓取某端口信息并打印到文件:-l 指定日志输出路径,日志文件将以 port.log 命名。

[root@localhost ~]# mysql-sniffer -i enp3s0 -p  -l /tmp/

3. 实时抓取多个端口信息并打印到文件:-l 指定日志输出路径,-p指定需要抓取的端口列表逗号分割,日志文件将以各自 port.log 命名。

[root@localhost ~]# mysql-sniffer -i enp3s0 -p 3306,, -l /tmp/

4. 实时抓取多个连续递增的端口并打印到文件:-l 指定日志输出路径,-r 指定端口范围,日志文件将以各自 port.log 命名。

[root@localhost ~]# mysql-sniffer -i enp3s0 -r - -l /tmp/

5. 实时抓取多个连续递增的端口同时过滤某几个端口,并打印到文件:-l 指定日志输出路径,-r 指定端口范围, -w 指定过滤端口列表逗号分割,日志文件将以各自 port.log 命名。

[root@localhost ~]# mysql-sniffer -i enp3s0 -r - -w , -l /tmp/  

6. 抓取某个端口以 daemon 模式运行(-d),并打印到文件:-l 指定日志输出路径,-p 指定端口, -n 指定数据包个数,日志文件将以各自 port.log 命名。

[root@localhost tmp]# mysql-sniffer -i enp3s0 -p  -l /tmp/ -d

7. 抓取某个端口并截取指定长度的 SQL:-p 指定端口, -t 指定SQL长度,将输出 SQL的前n个字符(适用于 SQL 过长的场景)。

[root@localhost ~]# mysql-sniffer -i enp3s0 -p  -t 
-- :: zhoujy 192.168.200.64 NULL 0ms select @@v...
-- :: zhoujy 192.168.200.64 NULL 0ms select USE...
-- :: zhoujy 192.168.200.64 NULL 0ms select ...

总结

通过上面的示例,看到mysql-sniffer工具通过指定的端口监控mysql,把所有的命里打印出来。看着和MySQL自己的general_log看似差不多,不过该工具已经按照需要的输出格式更好方便的查看,重要的还可以查看SQL范围的行数,可能在排查故障的时候用得到,先mark一下。

参考文档

MySQL抓包工具:MySQL Sniffer

MySQL抓包工具:MySQL Sniffer【转】的更多相关文章

  1. Mysql抓包工具 - MySQL Sniffer 使用小结 (含带general_log日志)

    在mysql运维工作中,一般会使用tcpdump做一些分析(直接读分析日志比较难以看明白,在数据库连接值高时使用):对于mysql实时的连接监控分析,通常会使用"mysqladmin/sho ...

  2. MySQL抓包工具:MySQL Sniffer 和性能优化

    简介 MySQL Sniffer 是一个基于 MySQL 协议的抓包工具,实时抓取 MySQLServer 端的请求,并格式化输出.输出内容包访问括时间.访问用户.来源 IP.访问 Database. ...

  3. MySQL、Redis、MongoDB网络抓包工具

    简介 go-sniffer 可以抓包截取项目(MySQL.Redis.MongoDB)中的请求并解析成相应的语句,并格式化输出.类似于在之前的文章 MySQL抓包工具:MySQL Sniffer[转] ...

  4. [工具]Mac平台开发几个网络抓包工具(sniffer)

    Cocoa Packet Analyzer http://www.tastycocoabytes.com/cpa/ Cocoa Packet Analyzer is a native Mac OS X ...

  5. Python+Requests接口测试教程(1):Fiddler抓包工具

    本书涵盖内容:fiddler.http协议.json.requests+unittest+报告.bs4.数据相关(mysql/oracle/logging)等内容.刚买须知:本书是针对零基础入门接口测 ...

  6. Linux 抓包工具:tcpdump

    tcpdump 是一个抓包工具,通常用来分析网络 安装tcpdump命令 [root@mysql test]# yum install -y tcpdump -i 指定网卡 捉取网卡数据包 抓取指定网 ...

  7. linux下抓包工具tcpdump详解

    本文转自:http://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html 简介 用简单的话来定义tcpdump,就是:dump the ...

  8. Linux下抓包工具tcpdump应用详解

      TCPDUMP简介 在传统的网络分析和测试技术中,嗅探器(sniffer)是最常见,也是最重要的技术之一.sniffer工具首先是为网络管理员和网络程序员进行网络分析而设计的.对于网络管理人员来说 ...

  9. 抓包工具tcpdump用法说明--2

    第一招: 通俗的说,tcpdump是一个抓包工具,用于抓取互联网上传输的数据包.形象的说,tcpdump就好比是国家海关,驻扎在出入境的咽喉要道,凡是要入境和出境的集装箱,海关人员总要打开箱子,看看里 ...

随机推荐

  1. 使用dockerfile,创建gitblit镜像

    1. 快速使用gitblit镜像 1.1 push 镜像 # docker pull /gitblit 1.2 查看下载的镜像 # docker images | grep "gitblit ...

  2. CSS3新增特性及知识学习线路

  3. How to setup Visual Studio without pain

    Visual Studio (VS) can be very hard to install. If you are lucky, one whole day may be enough to ins ...

  4. [转] C++中为什么要用指针,而不直接使用对象?

    原文点击这里 问题描述 我刚从 Java 转到使用 C++ 进行面向对象开发,我发现一个很让我非常困惑的问题:C++ 中经常出现使用对象指针,而不是直接使用对象本身的代码,比如下面这个例子: C++ ...

  5. kali入门

    第一章:入门kalilinux By:鬼尘 第一章基本上就是涵盖以下的主题: ·kali的发展简史 ·kali的一般用途 ·kali的下载与安装 ·kali的配置与更新 在本章结尾部分,我们还会介绍k ...

  6. Spring使用Autowiring自动装配 解决提示报错小技巧

    1.打开Settings   输入Inspections  找到Spring --> Spring Core --> Code --> Autowiring  for  Bean  ...

  7. GC算法基础

    寻找垃圾对象的算法:1. 引用计数(无法处理循环引用) 2. 根寻法(被广泛引用在gc算法中) 清理垃圾的算法: 1. 标记复制  2. 标记清理  3. 标记整理 分代算法的好处: 1. 分代处理, ...

  8. WPF 开发备忘录

    运营日: select t.*   from (select ab.*, bs.station_cn_name, bd.device_name           from audit_tvm_cas ...

  9. awk\sed\grep 补充

    # awk\sed\grep 补充 以上命令中字符 / 在sed中作为定界符使用,也可以使用任意的定界符 sed's:test:TEXT:g' sed's|test|TEXT|g' 定界符出现在样式内 ...

  10. Openvswitch手册(1): 架构,SSL, Manager, Bridge

    Openvswitch是一个virutal swtich, 支持Open Flow协议,当然也有一些硬件Switch也支持Open Flow协议,他们都可以被统一的Controller管理,从而实现物 ...