天天看點

使用mysqlsniffer捕獲SQL語句

MySQL5.1之前general log不能在運作時啟用或禁用,有時想捕捉SQL來查找問題就很麻煩,偶然間發現一個很不錯的小工具:mysqlsniffer,可以用來捕捉SQL語句,使用幫助如下:

mysqlsniffer --help

mysqlsniffer v1.2 - Watch MySQL traffic on a TCP/IP network

Usage: mysqlsniffer [OPTIONS] INTERFACE

OPTIONS:

--port N Listen for MySQL on port number N (default 3306)

--verbose Show extra packet information

--tcp-ctrl Show TCP control packets (SYN, FIN, RST, ACK)

--net-hdrs Show major IP and TCP header values

--no-mysql-hdrs Do not show MySQL header (packet ID and length)

--state Show state

--v40 MySQL server is version 4.0

--dump Dump all packets in hex

--help Print this

Original source code and more information at:

<a href="http://hackmysql.com/mysqlsniffer">http://hackmysql.com/mysqlsniffer</a>

INTERFACE是指網卡号,如eth0,eth1,lo等。

當然也有人直接tcpdump來捕捉的,方法如下:

tcpdump -i eth1 -s 0 -l -w - dst port 3306 | strings | perl -e '

while(&lt;&gt;) { chomp; next if /^[^ ]+[ ]*$/;

if(/^(SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER)/i) {

if (defined $q) { print "$qn"; }

$q=$_;

} else {

$_ =~ s/^[ t]+//; $q.=" $_";

}

}'

mysqlsniffer is a tcpdump clone specifically for dumping/sniffing/watching MySQL network protocol traffic over TCP/IP networks. mysqlsniffer is coded in C using the pcap library and works with MySQL version 4.0 and newer. mysqlsniffer is the only MySQL-specific network sniffer.

mk-query-digest also understands the MySQL protocol. It’s not a sniffer, though. It reads packet dumps from tcpdump like a slowlog. If you want to analyze queries from the wire (i.e. from network traffic), mk-query-digest is what you want.

For more information about the MySQL protocol read MySQL Internals ClientServer Protocol.

http://hackmysql.com/mysqlsniffer

1、下載下傳軟體包 http://hackmysql.com/code/mysqlsniffer.tgz

2、編譯安裝 root@real1 mysqlsniffer]# gcc -O2 -lpcap -o mysqlsniffer mysqlsniffer.c packet_handlers.c misc.c

如果出現如下提示

請安裝libpcap-devel 包,再重新用gcc來編譯

mysqlsniffer.c:26:18: 錯誤:pcap.h:沒有那個檔案或目錄

[root@real1 mysqlsniffer]# ./mysqlsniffer –help

mysqlsniffer v1.2 – Watch MySQL traffic on a TCP/IP network

–port N        Listen for MySQL on port number N (default 3306)  ##指定端口

–verbose       Show extra packet information                                       ## 顯示包的擴充資訊

–tcp-ctrl      Show TCP control packets (SYN, FIN, RST, ACK)     ## 顯示tcp包的狀态

–net-hdrs      Show major IP and TCP header values                       ##顯示ip和TCP的頭資訊

–no-mysql-hdrs Do not show MySQL header (packet ID and length)   ##不顯示ip和TCP的頭資訊

–state         Show state                                        ## 顯示狀态

–v40           MySQL server is version 4.0   ##如果MySQL伺服器版本是4.0 加上此參數

–dump          Dump all packets in hex   ##把輸入dump成hex檔案格式

–help          Print this

示例

./mysqlsniffer eth0 –port 3306 –tcp-ctrl –no-mysql-hdrs

server &gt; 127.0.0.1.24266: Waiting for server to finish response… ::DUMP:: 00 89 b0 f6 J 02 01 00 00 00 aa 00 00 00 f8 7 ‘ 14 10 00 1d b6 c0 00 00 00 00 00 05 00 00 1a 00 00 00 @ 00 00 01 00 00 00 00 00 00 00 00 06 03 s t d 04 1c 00 1c 00 1c 00 w e b d b 00 U P D A T E   z y a d s _ s t a t s     S E T   v i e w s   =   v i e w s   +   6 0   W H E R E   d a y   =   ‘ 2 0 0 9 – 1 1 – 0 8 ‘     A N D   z o n e i d   =   ‘ 3 2 5 ‘     A N D   a d s i d   =   ‘ 1 8 2 ‘ ::DUMP::

127.0.0.1.24266 &gt; server: ACK

127.0.0.1.37968 &gt; server: SYN

server &gt; 127.0.0.1.37968: SYN ACK

127.0.0.1.37968 &gt; server: ACK

server &gt; 127.0.0.1.37968: Handshake &lt;proto 10 ver 5.1.38-Linuxtone.Org-log thd 12629534&gt;

127.0.0.1.37968 &gt; server: Handshake (new auth) &lt;user 0252_liufei db (null) max pkt 1073741824&gt;

server &gt; 127.0.0.1.37968: ACK

server &gt; 127.0.0.1.37968: OK &lt;fields 0 affected rows 0 insert id 0 warnings 0&gt;

127.0.0.1.37968 &gt; server: COM_INIT_DB: webdb

127.0.0.1.37968 &gt; server: COM_QUERY: SET NAMES ‘gbk’

127.0.0.1.37968 &gt; server: COM_QUERY: SET sql_mode=”

127.0.0.1.37968 &gt; server: COM_QUERY: SELECT cpmdeduction,cpcdeduction,cpadeduction,cpsdeduction,cpvdeduction,cpczlink,cpazlink,cpszlink FROM zyads_users

WHERE uid=770 AND status=2 limit 0,1

server &gt; 127.0.0.1.37968: 8 Fields

Field: webdb.zyads_users.cpmdeduction &lt;type tiny int (257) size 3&gt;

Field: webdb.zyads_users.cpcdeduction &lt;type tiny int (257) size 3&gt;

Field: webdb.zyads_users.cpadeduction &lt;type tiny int (257) size 3&gt;

Field: webdb.zyads_users.cpsdeduction &lt;type tiny int (257) size 3&gt;

Field: webdb.zyads_users.cpvdeduction &lt;type tiny int (257) size 3&gt;

Field: webdb.zyads_users.cpczlink &lt;type tiny int (257) size 1&gt;

Field: webdb.zyads_users.cpazlink &lt;type tiny int (257) size 1&gt;

Field: webdb.zyads_users.cpszlink &lt;type tiny int (257) size 1&gt;

End &lt;warnings 0&gt;

|| 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 ||

127.0.0.1.37968 &gt; server: COM_QUERY: SELECT a.adsid,a.url,a.status,adstype,p.planid,p.deduction,p.plantype,p.price,p.priceadv,p.uid,p.expire,p.clearing,p.budget,u.money As advmoney,u.uid AS advuid FROM zyads_ads AS a ,zyads_plan As p ,zyads_users As u

WHERE a.adsid=26 AND a.planid=p.planid AND p.uid=u.uid AND  p.status = 1 AND  a.status = 3 AND u.status=2 limit 0,1

server &gt; 127.0.0.1.37968: 15 Fields

Field: webdb.a.adsid &lt;type int24 (777) size 9&gt;

Field: webdb.a.url &lt;type var string (509) size 510&gt;

Field: webdb.a.status &lt;type tiny int (2305) size 1&gt;

Field: webdb.a.adstype &lt;type var string (2557) size 20&gt;

Field: webdb.p.planid &lt;type int24 (777) size 8&gt;

Field: webdb.p.deduction &lt;type tiny int (1) size 3&gt;

Field: webdb.p.plantype &lt;type string (2558) size 6&gt;

Field: webdb.p.price &lt;type double (261) size 10&gt;

Field: webdb.p.priceadv &lt;type double (5) size 10&gt;

Field: webdb.p.uid &lt;type int24 (10505) size 8&gt;

Field: webdb.p.expire &lt;type date (33034) size 10&gt;

Field: webdb.p.clearing &lt;type var string (509) size 20&gt;

Field: webdb.p.budget &lt;type long int (259) size 11&gt;

Field: webdb.u.advmoney &lt;type double (5) size 12&gt;

Field: webdb.u.advuid &lt;type int24 (8969) size 8&gt;

|| 26 | http:// | 3 | tw | 3 | 0 | cpc | 0.0000 | 0.1000 | 15 | 0000-00-00 | month | 100000 | 99563626.7179 | 15 ||

127.0.0.1.37968 &gt; server: COM_QUERY: SELECT ip FROM zyads_tempip WHERE ip=’59.60.172.88′ AND planid=3  limit 0,1

server &gt; 127.0.0.1.37968: 1 Fields

Field: webdb.zyads_tempip.ip &lt;type string (2558) size 30&gt;

|| 59.60.172.88 ||

127.0.0.1.37968 &gt; server: COM_QUIT

127.0.0.1.37968 &gt; server: FIN ACK