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

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

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

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

有没有办法将该查询输出到文件并让它每秒运行一次左右?

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

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

答案1

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

它还会捕获所有查询,而这里提到的 TCP 嗅探技术则不然;这些技术不会捕获通过套接字执行的查询。观察 SHOW PROCESSLIST 也是如此;您会错过快速运行的查询。

如果您想通过进程列表或 TCP 流量捕获查询,我建议您使用 Percona Toolkit 的 pt-query-digest。它可以为您轮询进程列表(并从结果中得出意义,如果您自己捕获大量样本,这很难做到),并且可以解释 MySQL 的 TCP 协议,因此您可以抓取一些 TCP 流量并对其进行分析。当然,它也是有史以来最好的查询聚合器/分析器/报告器,但您没有说明捕获查询后要如何处理它们。

答案2

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

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

答案3

当然:

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

干杯

答案4

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

相关内容