如何捕获在MySQL服务器上运行的查询?


14

我们正在尝试进行一些服务器性能调试,我想捕获在几分钟内在我们的MySQL服务器上运行的查询的快照。

我熟悉MySQL SHOW FULL PROCESSLIST,但是我希望能够通过命令行运行它,因此我可以将其转储到文件中并进行后处理。

有没有办法将此查询输出到文件并使其每秒运行一次?

有没有更好的方法来捕获所有正在运行的查询?

请注意,我对慢速查询不感兴趣(我对慢速查询日志很熟悉)。


您正在运行什么操作系统?在Linux上,这非常容易做到,所以我猜是Windows吗?
Patrick

@Patrick Glad听说在Linux上很简单!赶走...
hafichuk 2012年

1
大多数查询将在不到一秒钟的时间内运行并完成,并且永远不会显示在您的列表中。
乔尔·科尔

此外,对于每个循环,较长的查询将多次出现一次,但是请确定您是否希望在bash循环中echo show full processlist | mysql更好或更合适SELECT info FROM information_schema.processlist WHERE Command="Query" AND User!="root"。添加几行内容,您将获得与innotop或 相同的查询功能pt-kill
theist

Answers:


10

我会使用慢查询日志。如果您设置long_query_time = 0,它将捕获所有查询,而不仅仅是慢速查询。

它还捕获所有查询,这与此处提到的TCP嗅探技术不同。那些不会捕获通过套接字执行的查询。同上观看SHOW PROCESSLIST;您会错过快速运行的查询。

如果要通过进程列表或TCP流量捕获查询,建议使用Percona Toolkit的pt-query-digest。它可以为您轮询进程列表(并从结果中弄清楚,如果您自己捕获一堆示例,这很难做到),并且它可以解释MySQL的TCP协议,因此您可以获取一些TCP流量并对其进行分析。当然,它也是有史以来编写的最好的查询聚合器/分析器/报告器,但是在捕获到查询后,您没有说出要对查询做什么。


13

最可靠的方法是使用“常规查询日志”,它将捕获所有查询:http : //dev.mysql.com/doc/refman/5.1/en/query-log.html

您没有指定MySQL服务器版本,但是如果您具有5.1.12或更高版本,则可以通过SQL使用全局变量启用和禁用该版本;有关详细信息,请参见文档。


谢谢@丹尼尔。我们已经启用了此功能,但是日志中没有时间戳信息。知道如何在其中获得时间戳吗?
hafichuk'2

抱歉,没有,只不过是指向您的手册。
丹尼尔·皮特曼

2
long_query_time = 0的慢查询日志是一个更好的选择。它仍然会捕获所有查询。
Schwartz男爵2012年

男爵+1:常规查询日志不包括您所需的性能指标。MySQL服务器还捆绑了perl脚本,用于分析慢速查询日志(从谓词中删除文字值)。但是请注意,较早版本的MySQL不支持不超过1秒的long_query_time-如果是这种情况,则可以进行升级-最新版本中还有很多性能增强。
symcbean 2012年


4

当然:

mysqladmin -u root -p -i 1 --verbose processlist > /tmp/pl.out

干杯


啊... mysqladmin。完美,谢谢@
HTTP500

1
实际上,这实际上每1秒运行一次processlist命令。一些非常快速的查询可能仍无法捕获。如果负载是由几个大查询组成的,它将起作用,如果负载是由许多小查询组成,则可能不会。
LSerni 2015年

@ Isemi,OP要求“每秒钟左右”。
HTTP500

4

这可能是Mysql Proxy的地方。基本上,它使您可以捕获(和操作)正在发送的查询。进行拦截的基本设置非常简单。然后只需更改您的客户端配置以指向代理,即可捕获所有请求。


4

基于终端的Wireshark程序tshark可能会帮助:

tshark -T fields -R mysql.query -e mysql.query

sudo yum install wireshark将在Amazon Linux上sudo apt-get install tshark为您提供tshark,在Ubuntu 14+上为您提供tshark


3

我使用了'Rui Pedro Bernardino的解决方案。效果很好,除了我在第一行中更改了一些内容,如下所述...

tcpdump -i any -s 0 -l -vvv -w - dst port 3306 | strings | perl -e 'while(<>) { chomp; next if /^[^ ]+[ ]*$/;
    if(/^(SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER)/i) {
    if (defined $q) { print "$q\n"; }
    $q=$_;
  } else {
    $_ =~ s/^[ \t]+//; $q.=" $_";
  }
}'


0

我一直在搜索,最后我登陆MONyog以实时监视在mysql服务器中执行的所有查询。唯一要注意的是要启用“ Performance_schema”和“ statements_digest”表,而Performance_schema是适用于MySQL 5.6.14及更高版本。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.