作者:赵黎明
爱可生 MySQL DBA 团队成员,熟悉 Oracle、MySQL 等数据库,擅长数据库性能问题诊断、事务与锁问题的分析等,负责处理客户 MySQL 及我司自研 DMP 平台日常运维中的问题,对开源数据库相关技术非常感兴趣。
1常用抓包工具
tshark、tcpdump 和 Wireshark 都是网络抓包工具,它们可以在网络上捕获和分析数据包。
tcpdump
一个开源的,基于命令行的网络抓包工具。它可以捕获和分析网络数据包,运行在几乎所有的 Unix 和 Linux 系统上;可以抓取实时网络通信中的数据包,然后通过过滤器及其他参数,对数据包进行解析和处理。
tshark
Wireshark 的命令行版本,也是一个开源的网络分析工具。它可以在命令行下捕获和分析网络流量数据,并使用 Wireshark 的过滤器来提取所需的数据,还支持与各种脚本语言(如 Python 和 Perl)结合使用,以自动化分析过程。
Wireshark
是一个流行的网络协议分析器,支持从在线网络或本地文件中捕获数据包,并提供了图形化用户界面来展示数据包内容;可以解析并显示各种网络协议,并提供了强大的分析工具以及过滤器;与 tshark 和 tcpdump 相比,Wireshark 的优势在于它提供了友好的 GUI 界面,使用户更轻松地进行网络协议的分析和调试。
小结
以上这些工具都可以直接捕获和分析网络数据包,但它们在使用方式和功能上略有不同;通常,我们会先用 tcpdump 或 tshark 在目标服务器上抓包生成 pcap 文件,再将其拿到装有 Wireshark 的主机上进行分析,本文将会分享 tshark 和 Wireshark 的一些使用技巧。
2三次握手和四次挥手
TCP 协议中的三次握手和四次挥手是 TCP 连接建立和关闭的过程。
三次握手
客户端向服务器发送 SYN 报文(请求建立连接)
服务器收到 SYN 报文后,回复 SYN+ACK 报文(同意建立连接)
客户端收到 SYN+ACK 报文后,再回复 ACK 报文(确认连接建立)
四次挥手
客户端向服务器发送 FIN 报文(请求断开连接)
服务器收到 FIN 报文后,回复 ACK 报文(确认收到请求)
当服务器确认数据已经全部发送完毕后,它会向客户端发送 FIN 报文(关闭连接)
客户端收到 FIN 报文后,回复 ACK 报文(表示确认收到关闭请求),至此,整个 TCP 连接就被彻底关闭了
三次握手用于建立连接,是双方协商建立 TCP 连接的过程;四次挥手用于断开连接,是双方结束 TCP 连接的过程;不过,有时候四次挥手也会变成三次(如果没有数据发送,2 个包会合并传输)。
3三次握手和四次挥手的过程
我们可以通过 tshark 抓包来观察 TCP 连接、断开的具体过程。
--在服务端执行tshark命令进行抓包 dmp2(master)~#tshark-f'tcpport3332andhost10.186.61.83' Runningasuser"root"andgroup"root".Thiscouldbedangerous. Capturingon'eth0' ==>等待捕获TCP包直到有内容输出 #此处省略了-i,默认会选择第一个非loopback的网络接口(可简写为lo),效果与指定-ieth0相同 #-f,指定捕获过滤器的表达式,可指定需要捕获的内容,如:协议、端口、主机IP等 --通过MySQL客户端远程连接到MySQL实例,等待片刻后再退出 {master}~#m3332-s(此处配置了alias,可省略具体的连接串) mysql:[Warning]Usingapasswordonthecommandlineinterfacecanbeinsecure. mysql>exit --观察屏幕输出 1、三次握手 从左到右的字段依次代表序号、时间戳(纳秒)、源端IP、目标端IP、协议、包的长度(字节)、具体信息(包括源/目标端口号或设备名、标志位等内容) 10.00000000010.186.61.83->10.186.60.68TCP7438858>mcs-mailsvr[SYN]Seq=0Win=29200Len=0MSS=1460SACK_PERM=1TSval=2369606050TSecr=0WS=128 20.00001836810.186.60.68->10.186.61.83TCP74mcs-mailsvr>38858[SYN,ACK]Seq=0Ack=1Win=28960Len=0MSS=1460SACK_PERM=1TSval=2369617045TSecr=2369606050WS=128 30.00023316110.186.61.83->10.186.60.68TCP6638858>mcs-mailsvr[ACK]Seq=1Ack=1Win=29312Len=0TSval=2369606050TSecr=2369617045 40.00059242010.186.60.68->10.186.61.83TCP148mcs-mailsvr>38858[PSH,ACK]Seq=1Ack=1Win=29056Len=82TSval=2369617045TSecr=2369606050 50.00082792010.186.61.83->10.186.60.68TCP6638858>mcs-mailsvr[ACK]Seq=1Ack=83Win=29312Len=0TSval=2369606051TSecr=2369617045 60.00083351210.186.61.83->10.186.60.68TCP10238858>mcs-mailsvr[PSH,ACK]Seq=1Ack=83Win=29312Len=36TSval=2369606051TSecr=2369617045 70.00083726310.186.60.68->10.186.61.83TCP66mcs-mailsvr>38858[ACK]Seq=83Ack=37Win=29056Len=0TSval=2369617045TSecr=2369606051 80.00199799810.186.61.83->10.186.60.68TCP26438858>mcs-mailsvr[PSH,ACK]Seq=37Ack=83Win=29312Len=198TSval=2369606052TSecr=2369617045 90.00202191610.186.60.68->10.186.61.83TCP66mcs-mailsvr>38858[ACK]Seq=83Ack=235Win=30080Len=0TSval=2369617047TSecr=2369606052 100.00697722310.186.60.68->10.186.61.83TCP2088mcs-mailsvr>38858[PSH,ACK]Seq=83Ack=235Win=30080Len=2022TSval=2369617052TSecr=2369606052 110.00722734010.186.61.83->10.186.60.68TCP6638858>mcs-mailsvr[ACK]Seq=235Ack=2105Win=33280Len=0TSval=2369606057TSecr=2369617052 120.00842644710.186.61.83->10.186.60.68TCP17138858>mcs-mailsvr[PSH,ACK]Seq=235Ack=2105Win=33280Len=105TSval=2369606058TSecr=2369617052 130.00881232410.186.60.68->10.186.61.83TCP308mcs-mailsvr>38858[PSH,ACK]Seq=2105Ack=340Win=30080Len=242TSval=2369617053TSecr=2369606058 140.00909971210.186.61.83->10.186.60.68TCP29138858>mcs-mailsvr[PSH,ACK]Seq=340Ack=2347Win=36224Len=225TSval=2369606059TSecr=2369617053 150.00918964410.186.60.68->10.186.61.83TCP106mcs-mailsvr>38858[PSH,ACK]Seq=2347Ack=565Win=31104Len=40TSval=2369617054TSecr=2369606059 160.00944393610.186.61.83->10.186.60.68TCP13238858>mcs-mailsvr[PSH,ACK]Seq=565Ack=2387Win=36224Len=66TSval=2369606059TSecr=2369617054 170.00965640510.186.60.68->10.186.61.83TCP187mcs-mailsvr>38858[PSH,ACK]Seq=2387Ack=631Win=31104Len=121TSval=2369617054TSecr=2369606059 180.04964153210.186.61.83->10.186.60.68TCP6638858>mcs-mailsvr[ACK]Seq=631Ack=2508Win=36224Len=0TSval=2369606100TSecr=2369617054 #序号1-3的包,即TCP三次握手的过程 #1)110.186.61.83->10.186.60.68TCP7438858>mcs-mailsvr[SYN]Seq=0 #2)210.186.60.68->10.186.61.83TCP74mcs-mailsvr>38858[SYN,ACK]Seq=0Ack=1 #3)310.186.61.83->10.186.60.68TCP6638858>mcs-mailsvr[ACK]Seq=1Ack=1 2、四次挥手(在客户端执行exit命令后才会输出) 1986.74417350110.186.61.83->10.186.60.68TCP10038858>mcs-mailsvr[PSH,ACK]Seq=631Ack=2508Win=36224Len=34TSval=2369692794TSecr=2369617054 2086.74419455110.186.61.83->10.186.60.68TCP6638858>mcs-mailsvr[FIN,ACK]Seq=665Ack=2508Win=36224Len=0TSval=2369692794TSecr=2369617054 2186.74438941710.186.60.68->10.186.61.83TCP66mcs-mailsvr>38858[FIN,ACK]Seq=2508Ack=666Win=31104Len=0TSval=2369703789TSecr=2369692794 2286.74463220310.186.61.83->10.186.60.68TCP6638858>mcs-mailsvr[ACK]Seq=666Ack=2509Win=36224Len=0TSval=2369692795TSecr=2369703789 #序号20-22的包,为四次挥手的过程,这里由于服务器并没有数据要传输给客户端,所以将FIN和ACK合并在一个TCP包中了,即所谓的四次挥手变成了三次 #1)201986.74417350110.186.61.83->10.186.60.68TCP10038858>mcs-mailsvr[PSH,ACK]Seq=631Ack=2508 #2)2110.186.60.68->10.186.61.83TCP66mcs-mailsvr>38858[FIN,ACK]Seq=2508Ack=666 #3)2210.186.61.83->10.186.60.68TCP6638858>mcs-mailsvr[ACK]Seq=666Ack=2509
4TCP 包标志位的说明
TCP (传输控制协议)包头部有 6 个标志位(Flag),分别为 URG、ACK、PSH、RST、SYN、FIN,它们的十六进制值分别为:0x20、0x10、0x08、0x04、0x02、0x01,其中每个标志位的意义如下:
URG 标志:紧急指针是否有效
ACK 标志:确认号是否有效
PSH 标志:Push操作,尽可能快地将数据交给应用层
RST 标志:重置连接
SYN 标志:发起一个新的连接
FIN 标志:释放连接
5tshark 常见用法示例
1. tshark 以自定义字段来展示信息
--服务端执行抓包 dmp2(master)~#tshark-ieth0-dtcp.port==3332,mysql-f"host10.186.61.83andtcpport3332"-Tfields-eframe.time-eip.host-etcp.flags Runningasuser"root"andgroup"root".Thiscouldbedangerous. Capturingon'eth0' #-Tfields,可以指定需要输出的字段,需配合-e一起使用,此处将分别打印获取包的时间、主机IP及TCP的标志位,这些字段会按照-e的顺序进行排列展示 #-e,支持多种协议下的字段展示,具体用法查询路径:Wireshark ->分析->显示过滤器表达式 --通过 MySQL 客户端连接实例,执行一个查询,再退出(共有 3 部分:连接、通信、断连) {master}~#m3332-s mysql:[Warning]Usingapasswordonthecommandlineinterfacecanbeinsecure. mysql>select@@version; @@version 5.7.36-log mysql>exit --观察屏幕输出 1、三次握手 "Jun6,20231442.839863403CST"10.186.61.83,10.186.60.680x00000002 "Jun6,20231442.839904347CST"10.186.60.68,10.186.61.830x00000012 "Jun6,20231442.840263352CST"10.186.61.83,10.186.60.680x00000010 "Jun6,20231442.840666158CST"10.186.60.68,10.186.61.830x00000018 "Jun6,20231442.841604106CST"10.186.61.83,10.186.60.680x00000010 "Jun6,20231442.841612112CST"10.186.61.83,10.186.60.680x00000018 "Jun6,20231442.841616568CST"10.186.60.68,10.186.61.830x00000010 "Jun6,20231442.842524996CST"10.186.61.83,10.186.60.680x00000018 "Jun6,20231442.842550796CST"10.186.60.68,10.186.61.830x00000010 "Jun6,20231442.848566815CST"10.186.60.68,10.186.61.830x00000018 "Jun6,20231442.848826004CST"10.186.61.83,10.186.60.680x00000010 "Jun6,20231442.850258537CST"10.186.61.83,10.186.60.680x00000018 "Jun6,20231442.850881377CST"10.186.60.68,10.186.61.830x00000018 "Jun6,20231442.851278991CST"10.186.61.83,10.186.60.680x00000018 "Jun6,20231442.851395808CST"10.186.60.68,10.186.61.830x00000018 "Jun6,20231442.851667278CST"10.186.61.83,10.186.60.680x00000018 "Jun6,20231442.851926804CST"10.186.60.68,10.186.61.830x00000018 "Jun6,20231442.892409030CST"10.186.61.83,10.186.60.680x00000010 #前三个包分别为:0x02 [SYN]、0x12 [SYN, ACK]、0x10[ACK],即三次握手的过程 #后面的几个包:0x18 [PSH, ACK]、0x10[ACK],是数据传输的过程 2、执行一个查询 "Jun6,20231419.967273148CST"10.186.61.83,10.186.60.680x00000018 "Jun6,20231419.967553321CST"10.186.60.68,10.186.61.830x00000018 "Jun6,20231419.967835719CST"10.186.61.83,10.186.60.680x00000010 #当TCP连接完成后,在数据传输过程中获取的包,其标志位为0x18[PSH,ACK]或0x10[ACK] 3、四次挥手 "Jun6,20231406.157240404CST"10.186.61.83,10.186.60.680x00000018 "Jun6,20231406.157833986CST"10.186.61.83,10.186.60.680x00000011 "Jun6,20231406.166359966CST"10.186.61.83,10.186.60.680x00000011 "Jun6,20231406.166378115CST"10.186.60.68,10.186.61.830x00000010 "Jun6,20231406.166971169CST"10.186.60.68,10.186.61.830x00000011 "Jun6,20231406.167317550CST"10.186.61.83,10.186.60.680x00000010 #看最后4个包,0x11[FIN,ACK]、0x10[ACK]、0x11[FIN,ACK]、0x10[ACK],这是标准的四次挥手过程
2. tshark 抓取 MySQL 中执行的 SQL
--在服务器上执行抓包 dmp2(master)~#tshark-f'tcpport3332'-Y"mysql.query"-dtcp.port==3332,mysql-Tfields-eframe.time-eip.src-eip.dst-emysql.query Runningasuser"root"andgroup"root".Thiscouldbedangerous. Capturingon'eth0' #-Y,指定显示过滤器表达式,在单次分析中可以代替-R选项,此处表示仅显示mysql.query相关的包 #-d,用于指定该抓包会话的协议详细解析器模块,可以执行tshark-dhelp来查看可用的协议(执行虽然会报错,但会显示所有支持的协议),此处表示将3332端口上的TCP包以MySQL协议进行解析 #-Tfields-emysql.query,即可获取符合MySQL协议的SQL语句 #-eip.src-eip.dst的写法,也可以用-eip.host来替换 --先停止从库复制后再启动 zlm@10.186.60.74[(none)]>stopslave; QueryOK,0rowsaffected(0.06sec) zlm@10.186.60.74[(none)]>startslave; QueryOK,0rowsaffected(0.05sec) --观察屏幕输出 "Jun6,20231638.831359581CST"10.186.60.7410.186.60.68SELECTUNIX_TIMESTAMP() "Jun6,20231638.832278722CST"10.186.60.7410.186.60.68SELECT@@GLOBAL.SERVER_ID "Jun6,20231638.832613595CST"10.186.60.7410.186.60.68SET@master_heartbeat_period=1000000000 "Jun6,20231638.832861743CST"10.186.60.7410.186.60.68SET@master_binlog_checksum=@@global.binlog_checksum "Jun6,20231638.833078690CST"10.186.60.7410.186.60.68SELECT@master_binlog_checksum "Jun6,20231638.833278049CST"10.186.60.7410.186.60.68SELECT@@GLOBAL.GTID_MODE "Jun6,20231638.833489342CST"10.186.60.7410.186.60.68SELECT@@GLOBAL.SERVER_UUID "Jun6,20231638.833769721CST"10.186.60.7410.186.60.68SET@slave_uuid='90161133-88b1-11ed-bbcc-02000aba3c4a' #通过指定MySQL协议解析模块,此处捕获到了MySQL从实例在启动复制时会执行的SQL语句 #如已用-d 选项指定了协议、端口等信息时,可省略-f(抓包过滤器表达式),除非还有其他的过滤需求,但不建议省略-Y(显示过滤器表达式),否则会输出非常多的信息,以下两种写法是等效的: tshark-f'tcpport3332'-Y"mysql.query"-dtcp.port==3332,mysql-Tfields-eframe.time-eip.host-emysql.query tshark-Y"mysql.query"-dtcp.port==3332,mysql-Tfields-eframe.time-eip.host-emysql.query --获取类型为Query的SQL dmp2(master)~#tshark-ilo-dtcp.port==3332,mysql-Y"mysql.command==3"-Tfields-eip.host-emysql.query-eframe.time-c10 Runningasuser"root"andgroup"root".Thiscouldbedangerous. Capturingon'Loopback' 127.0.0.1,127.0.0.1STARTTRANSACTION"Jun7,20231729.194080437CST" 127.0.0.1,127.0.0.1insertignoreintouniverse.u_delay(source,real_timestamp,logic_timestamp)values('ustats',now(),0)"Jun7,20231729.194306733CST" 127.0.0.1,127.0.0.1updateuniverse.u_delaysetreal_timestamp=now(),logic_timestamp=logic_timestamp+1wheresource='ustats'"Jun7,20231729.194647464CST" 127.0.0.1,127.0.0.1COMMIT"Jun7,20231729.194953692CST" 4packetscaptured #mysql.command=3,表示执行的SQL类型为Query,共支持30多种预设值 #对于熟悉DMP的小伙伴,一看便知这是由平台纳管的一个实例,当前正在做时间戳的写入(判断主从延时的依据) --获取与show相关的SQL dmp2(master)~#tshark-ilo-dtcp.port==3332,mysql-Y'mysql.querycontains"show"'-Tfields-eip.host-emysql.query-eframe.time-c10 Runningasuser"root"andgroup"root".Thiscouldbedangerous. Capturingon'Loopback' 127.0.0.1,127.0.0.1showslavestatus"Jun7,20231744.672060318CST" 127.0.0.1,127.0.0.1showglobalstatus"Jun7,20231744.672808866CST" 127.0.0.1,127.0.0.1showglobalvariables"Jun7,20231744.672845236CST" 127.0.0.1,127.0.0.1showglobalvariableswhereVariable_name='innodb_flush_log_at_trx_commit'orVariable_name='sync_binlog'"Jun7,20231744.673036197CST" 4packetscaptured dmp2(master)~#tshark-ilo-dtcp.port==3332,mysql-Y'mysql.querymatches"^show"'-Tfields-eip.host-emysql.query-eframe.time-c10 Runningasuser"root"andgroup"root".Thiscouldbedangerous. Capturingon'Loopback' 127.0.0.1,127.0.0.1showglobalstatus"Jun7,20231702.671895630CST" 127.0.0.1,127.0.0.1showslavestatus"Jun7,20231702.671944388CST" 127.0.0.1,127.0.0.1showglobalvariables"Jun7,20231702.671998965CST" 127.0.0.1,127.0.0.1showmasterstatus"Jun7,20231702.672673795CST" 4packetscaptured #contains使用字符串进行匹配,只要在数据包中存在指定的字符串,就会匹配成功,不论该字符串出现在查询的任何位置 #matches 支持使用正则表达式进行匹配,匹配符合指定规则的数据包,如:^show #用contains/maches进行匹配查找时,关键词需用双引号包围,此时外层建议使用单引号,因为maches进行正则匹配时,外层使用双引号会报错,contains则不限制 #以上匹配方式类似模糊查询,但会区分大小写,如果指定Show或SHOW为关键词,可能获取不到SQL
3. tshark 抓取 OB 中执行 SQL
与之前的方法类似,只需调整 IP 地址和端口号即可。
--抓取5个mysql.query协议的包 [root@10-186-65-73~]#tshark-ilo-Y"mysql.query"-dtcp.port==2881,mysql-Tfields-eframe.time-eip.host-emysql.query-c5 Runningasuser"root"andgroup"root".Thiscouldbedangerous. Capturingon'Loopback' "Jun7,20231512.886615893CST"127.0.0.1,127.0.0.1select/*+MONITOR_AGENTREAD_CONSISTENCY(WEAK)*/__all_tenant.tenant_id,tenant_name,mem_used,access_count,hit_countfromv$plan_cache_statjoin__all_tenantonv$plan_cache_stat.tenant_id=__all_tenant.tenant_id "Jun7,20231512.889500546CST"127.0.0.1,127.0.0.1select/*+MONITOR_AGENTREAD_CONSISTENCY(WEAK)*/tenant_name,tenant_id,casewhenevent_id=10000then'INTERNAL'whenevent_id=13000then'SYNC_RPC'whenevent_id=14003then'ROW_LOCK_WAIT'when(event_id>=10001andevent_id<= 11006) or (event_id >=11008andevent_id<= 11011) then 'IO' when event like 'latch:%' then 'LATCH' else 'OTHER' END event_group, sum(total_waits) as total_waits, sum(time_waited_micro / 1000000) as time_waited from v$system_event join __all_tenant on v$system_event.con_id = __all_tenant.tenant_id where v$system_event.wait_class <>'IDLE'and(con_id>1000orcon_id=1)groupbytenant_name,event_group 2packetscaptured #执行抓包命令的服务器是OBServer集群内的一个节点,2881是OB的对外服务的端口号 #-c,指定抓取5个包,实际上只抓到了2个符合过滤条件的包 #从获取的SQL语句来看,猜测是由ocp_monagent监控组件发起的信息收集相关的SQL --抓包时过滤包含“__all_”视图的SQL [root@10-186-65-73~]#tshark-ilo-Y'mysql.querycontains"__all_"'-dtcp.port==2881,mysql-Tfields-eframe.time-eip.host-emysql.query-c5 Runningasuser"root"andgroup"root".Thiscouldbedangerous. Capturingon'Loopback' "Jun7,20231838.895171334CST"127.0.0.1,127.0.0.1select/*+MONITOR_AGENTREAD_CONSISTENCY(WEAK)*/tenant_name,tenant_id,stat_id,valuefromv$sysstat,__all_tenantwherestat_idIN(10000,10001,10002,10003,10004,10005,10006,140002,140003,140005,140006,40030,60019,60020,60024,80040,80041,130000,130001,130002,130004,20000,20001,20002,30000,30001,30002,30005,30006,30007,30008,30009,30010,30011,30012,30013,40000,40001,40002,40003,40004,40005,40006,40007,40008,40009,40010,40011,40012,40018,40019,50000,50001,50002,50004,50005,50008,50009,50010,50011,50037,50038,60000,60001,60002,60003,60004,60005,60019,60020,60021,60022,60023,60024,80057,120000,120001,120009,120008)and(con_id>1000orcon_id=1)and__all_tenant.tenant_id=v$sysstat.con_idandclass< 1000 "Jun 7, 2023 1838.896653822 CST" 127.0.0.1,127.0.0.1 select /*+ MONITOR_AGENT READ_CONSISTENCY(WEAK) */ tenant_id, tenant_name, sum(total_waits) as total_waits, sum(time_waited_micro) / 1000000 as time_waited from v$system_event join __all_tenant on v$system_event.con_id = __all_tenant.tenant_id where v$system_event.wait_class <>'IDLE'groupbytenant_name 2packetscaptured [root@10-186-65-73~]#tshark-ilo-Y'mysql.querycontains"__all_"'-dtcp.port==2881,mysql-Tfields-eframe.time-eip.host-emysql.query>/tmp/monit_ob.txt Runningasuser"root"andgroup"root".Thiscouldbedangerous. Capturingon'Loopback' 124^C Youhavemailin/var/spool/mail/root [root@10-186-65-73~]#cat/tmp/monit_ob.txt|grep-iselect|wc-l #可用此方法来获取一些常用的“__all_”视图相关的监控SQL #将捕获的SQL重定向到文本文件,再用awk处理一下就能获取完整的SQL [root@10-186-65-73~]#awk-F""'{for(i=7;i<=NF;i++)printf("%s ", $i);print ""}' /tmp/monit_ob.txt|cat -n|head -5 1 select /*+ MONITOR_AGENT READ_CONSISTENCY(WEAK) */ zone, name, value, time_to_usec(now()) as current from __all_zone 2 select /*+ MONITOR_AGENT READ_CONSISTENCY(WEAK) */ __all_tenant.tenant_id, tenant_name, cache_name, cache_size from __all_virtual_kvcache_info, __all_tenant where __all_tenant.tenant_id = __all_virtual_kvcache_info.tenant_id and svr_ip = '10.186.65.73' and svr_port = 2882 3 select /*+ MONITOR_AGENT READ_CONSISTENCY(WEAK) */ case when cnt is null then 0 else cnt end as cnt, tenant_name, tenant_id from (select __all_tenant.tenant_name, __all_tenant.tenant_id, cnt from __all_tenant left join (select count(1) as cnt, tenant as tenant_name from __all_virtual_processlist where svr_ip = '10.186.65.73' and svr_port = 2882 group by tenant) t1 on __all_tenant.tenant_name = t1.tenant_name) t2 4 select /*+ MONITOR_AGENT READ_CONSISTENCY(WEAK) */ case when cnt is null then 0 else cnt end as cnt, tenant_name, tenant_id from (select __all_tenant.tenant_name, __all_tenant.tenant_id, cnt from __all_tenant left join (select count(`state`='ACTIVE' OR NULL) as cnt, tenant as tenant_name from __all_virtual_processlist where svr_ip = '10.186.65.73' and svr_port = 2882 group by tenant) t1 on __all_tenant.tenant_name = t1.tenant_name) t2 5 select /*+ MONITOR_AGENT READ_CONSISTENCY(WEAK) */ __all_tenant.tenant_id, tenant_name, mem_used, access_count, hit_count from v$plan_cache_stat join __all_tenant on v$plan_cache_stat.tenant_id = __all_tenant.tenant_id
4. tshark 抓包后用 Wireshark 解析
tshark 也可以像 tcpdump 一样,先在服务器上抓包,再拿到 Wireshark 的图形窗口中做进一步分析。
--抓取50个包并生成pcap文件 dmp2(master)~#tshark-dtcp.port==3332,mysql-f'tcpport3332andhost10.186.61.83'-c50-w/tmp/61_83.pcap Runningasuser"root"andgroup"root".Thiscouldbedangerous. Capturingon'eth0' #注意,-w 指定的文件无需提前创建,但抓包会话必须对该目录有写入权限,否则会报权限不足的错误。
以下截图为三次握手和四次挥手的过程。
同样地,也可以在 Wireshark 中将 mysql.query 字段展示出来:Wireshark -> 编辑 -> 首选项 -> 外观 -> 列 。
以下显示过滤器表达式中的内容表示:将包中 TCP 端口为 3332,源端 IP 地址为 10.186.60.74,协议类型为 MySQL 的内容过滤并展示,效果如图:
6结语
tshark 作为 Wireshark 的命令行工具,与我们比较熟悉的 tcpdump 相比,有其不少优点:
1. 更多的过滤条件
具有比 tcpdump 更多的过滤条件,可以更加精确地过滤所需的数据包,tshark 支持 Wireshark 过滤器语法的全部特性,并提供了更高级的功能。
2. 更加灵活的输出格式
可以以不同的文件格式和标准输出打印输出捕获数据,而 tcpdump 的输出格式非常有限。
3. 更好的可读性和易用性
输出会更加易于阅读,因为它会对分组进行解析并显示其中包含的各种数据,比如协议、参数和错误信息等。这些信息对数据包分析非常有帮助。
4. 更加轻量级
相比于 tcpdump,占用的系统资源较少,并且不需要将所有数据存储在内存中,从而能够处理更大的数据流。
5. 更多的网络协议
支持更多的网络协议,包括 IPv6、IS-IS、IPX 等,而 tcpdump 支持的协议种类相对较少。
综上,在一些较为复杂的数据包分析和网络问题诊断场景中,更推荐使用 tshark,而对于只需快速捕捉网络流量的简单应用场景,tcpdump 可能会更适合一些。
审核编辑:汤梓红
-
数据库
+关注
关注
7文章
3792浏览量
64340 -
开源
+关注
关注
3文章
3299浏览量
42458 -
MySQL
+关注
关注
1文章
804浏览量
26519 -
DBA
+关注
关注
0文章
18浏览量
7880 -
Wireshark
+关注
关注
0文章
49浏览量
6509
原文标题:DBA抓包神器tshark测评
文章出处:【微信号:OSC开源社区,微信公众号:OSC开源社区】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论