[20140212]linux下使用tcpdump抓取sql语句

[20140212]linu下使用tcpdump抓取sql语句.txt

我们生产系统问题多多,经常要跟踪用户执行的sql语句,当出现问题时要跟踪比较麻烦,我需要一个快捷的方式"看到"用户执行的sql语
句,想到了tcpdump抓包软件。

我测试建立shell脚本如下:

#! /bin/bash
/usr/sbin/tcpdump -l -i eth0 -s 16384 -A -nn src host $1 and dst port 1521

--说明:
-- -l     Make stdout line buffered.  Useful if you want to see the data while capturing it.  E.g.,
          ''tcpdump  -l  |  tee dat'' or ''tcpdump  -l   > dat  &  tail  -f  dat''.
--这样可以立即看到包。不然要等待缓存,可能漏掉一些sql语句。
-- -i     指网络接口。
-- -s     抓包长度,这个设置多少我还真不知道,我乱写为16384
-- -A     Print each packet (minus its link level header) in ASCII.  Handy for capturing web pages.

--- 执行很简单,参数使用ip地址就ok了。

Tcpdumpsql ip_address

很明显抓取的东西有一些乱。虽然sql语句也在里面,但是显示太乱了。想到了一些过滤命令grep等等。但是如果sql语句太长,这样也不
是很好。我开始google看看是否有人写一些相似的命令,输入tcpdump oracle

http://appcrawler.com/wordpress/2012/08/01/tcpdump-to-see-oracle-errors/

他使用tcpdump抓取oracle错误。在其网站检索发现:
http://appcrawler.com/wordpress/2012/11/09/tracing-sql-across-the-wire/

这个正是我需要的。

按照以上脚本修改如下:

# cat /usr/local/bin/Tcpdumpsql
#! /bin/bash
/usr/sbin/tcpdump -l -i eth0 -s 16384 -A -nn src host $1 and dst port 1521 |  sed  -u -e  "s/^\.*//;s/\.*$//" | \
awk '{if (tolower($0) ~ "select" || tolower($0) ~ "update" ||  tolower($0) ~ "delete") {p=1;print} \
else if(p == 1 && $0 !~ "^[0-9][0-9]:") {print} else if ($0 ~ "^[0-9][0-9]:") {p=0}}'

--前面的. 实际上前面含有^M。修改如下ok了。

#! /bin/bash
/usr/sbin/tcpdump  -l -i eth0 -s 16384 -A -nn src host $1 and dst port 1521 2>/dev/null | sed -u -e  "s/^M/!/g;s/^E\.\..\{1,100\}//;s/\.*$//;s/^\.*//" | \
awk '{if (tolower($0) ~ "select" || tolower($0) ~ "update" ||  tolower($0) ~ "delete" || tolower($0) ~ "insert" ) {p=1;print} \
else if(p == 1 && $0 !~ "^[0-9][0-9]:") {print} else if ($0 ~ "^[0-9][0-9]:") {p=0}}'

--^M 输入要ctrl+v ctrl+m.

顺便测试alter session set cursor_sharing=force ;转换成绑定在那里发生:

alter session set cursor_sharing=force ;
select * from dept where deptno= 30;

截取sql如下:
#select * from dept where deptno= 30

--保持原样,可见转换在服务器端完成。

前面的#实际上sql语句的长度指示器。

select dump('#') from dual ;
DUMP('#')
-------------------
Typ=96 Len=1: 35

select length('select * from dept where deptno= 30') from dual ;
LENGTH('SELECT*FROMDEPTWHEREDEPTNO=30')
---------------------------------------
                                     35
--sql语句长度35,正好合适。

如果很长FF+sql语句+FF+sql语句+剩下长度+sql语句,这样截取的可能有不需要的字符。不过仅仅拿来看个大概,基本没有问题。还有一些前面可能出现\n,这样转换可能存在一些问题,
总体满足自己的需要。

时间: 2024-11-08 22:06:25

[20140212]linux下使用tcpdump抓取sql语句的相关文章

通过tcpdump抓取mysql语句分析故障

近期在对mysql例行检查时候,发现有台服务器竟然把千兆内网跑慢了.相当异常,但通过show processlist并为发现异常的进程在运行中. 仔细看了后,发现是个sleep,若kill掉后,流量马上就下降了,但它究竟在做什么呢? 为了进一步定位出问题来,想到之前用过的脚本tcpdump分析下是什么内容一直在占用带宽.  代码如下 复制代码 #!/bin/bash #this script used montor mysql network traffic.echo sql tcpdump -

tcpdump抓取移动终端的数据包

问题描述 tcpdump抓取移动终端的数据包 C:UsersTJW>adb devicesList of devices attached5066adc2 device C:UsersTJW>adb shellshell@cancro:/ $ suroot@cancro:/ # adb push e:/tcpdump /data/localerror: device not found1|root@cancro:/ # chmod 777 /data/localroot@cancro:/ #1

iameter-为什么tcpdump抓取的包都是I包,没有U包和T包

问题描述 为什么tcpdump抓取的包都是I包,没有U包和T包 只有CCR与CCA的INITIAL_REQUEST的交互没有update和Term的CCR与CCA 解决方案 设置的过滤条件对不对 解决方案二: tcpdump有很多参数的

如何有效抓取SQL Server的BLOCKING信息

原文:如何有效抓取SQL Server的BLOCKING信息 转自:微软亚太区数据库技术支持组 官方博客 http://blogs.msdn.com/b/apgcdsd/archive/2011/12/12/sql-server-blocking.aspx SQL Server允许并发操作,BLOCKING是指在某一操作没有完成之前,其他操作必须等待,以便于保证数据的完整性.BLOCKING的解决方法要查看BLOCKING的头是什么,为什么BLOCKING头上的语句执行的很慢.通常来讲只要我们能

linux下利用tcpdump实现24小时自动抓包

  安装tcpdump  代码如下   # yum install tcpdump 脚本里有注释#diy的,表示下一行需自定义修改. 脚本都放在home目录下;crontab里写: * */6 * * * /bin/bash /home/monitor_dump.sh * */6 * * * /bin/bash /home/monitor_disk.sh 根据当磁盘空间的大小和流量的大小确定crontab里的时间间隔 因加了crontab要时间到才执行,为了现在执行,可执行:nohup sh /

利用tcpdump抓取mysql sql语句

这个脚本是我之前在网上无意间找个一个利用tcpdump 抓包工具获取mysql流量,并通过过滤把sql 语句输入. 脚本不是很长,但是效果很好. #!/bin/bash #this script used montor mysql network traffic.echo sql tcpdump -i eth0 -s 0 -l -w - dst port 3306 | strings | perl -e ' while(<>) { chomp; next if /^[^ ]+[ ]*$/; i

分享下页面关键字抓取www.icbase.com站点代码(带asp.net参数的)_php实例

复制代码 代码如下: <?php/** * HOST: www.icbase.com *///set_time_limit(0);// base functionfunction curl_get($url, $data = array(), $header = array(), $timeout = 15, $port = 80, $reffer = '', $proxy = ''){ $ch = curl_init(); if (!empty($data)) { $data = is_arr

分享下页面关键字抓取components.arrow.com站点代码_php实例

复制代码 代码如下: <?php /** * HOST: components.arrow.com */ //set_time_limit(0); // base function function curl_get($url, $data = array(), $header = array(), $timeout = 15, $port = 80, $reffer = '', $proxy = '') { $ch = curl_init(); if (!empty($data)) { $da

php下通过curl抓取yahoo boss 搜索结果的实现代码

1.编写curl类,进行网页内容抓取 复制代码 代码如下: class CurlUtil { private $curl; private $timeout = 10; /** * 初始化curl对象 */ public function __construct() { $this->curl = curl_init(); curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($this->curl, CURLO