如何在我的Linux服务器上跟踪MySQL查询?

例如,我想要设置某种侦听器,然后请求一个web页面并查看引擎执行的所有查询,或者只是查看在生产服务器上运行的所有查询。我该怎么做呢?


当前回答

运行这个方便的SQL查询来查看正在运行的MySQL查询。它可以在您喜欢的任何环境中运行,无需任何代码更改或开销。它可能需要一些MySQL权限配置,但对我来说,它不需要任何特殊设置就可以运行。

SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND != 'Sleep';

唯一的问题是,你经常会错过执行非常快的查询,所以它对运行时间较长的查询或MySQL服务器有正在备份的查询时最有用——以我的经验,这正是我想要查看“活动”查询的时候。

您还可以添加条件,使其更特定于任何SQL查询。

显示所有运行5秒或更长时间的查询:

SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND != 'Sleep' AND TIME >= 5;

显示所有正在运行的更新:

SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND != 'Sleep' AND INFO LIKE '%UPDATE %';

详情见:http://dev.mysql.com/doc/refman/5.1/en/processlist-table.html

其他回答

尽管答案已经被接受,但我想提出一个可能是最简单的选择:

$ mysqladmin -u bob -p -i 1 processlist

这将每秒钟在屏幕上打印当前查询。

-u执行命令的mysql用户名 -p提示输入你的密码(这样你就不必把它保存在一个文件中或让命令出现在你的命令历史中) i以秒为单位的间隔。 使用——verbose标志显示完整的进程列表,显示每个进程的整个查询。(谢谢,nmat)

这可能有一个缺点:如果快速查询在您设置的时间间隔之间运行,则可能不会显示。IE:我的间隔设置为1秒,如果有一个查询需要0.02秒才能运行,并且在间隔之间运行,您将看不到它。

当您希望快速检查正在运行的查询而无需设置侦听器或其他任何东西时,最好使用此选项。

除了前面描述如何启用一般日志记录的答案之外,在将任何SQL写入日志之前,我必须在我的香草MySql 5.6安装中修改一个额外的变量:

SET GLOBAL log_output = 'FILE';

默认设置为“NONE”。

如果你想进行监控和统计,那么有一个很好的开源工具Percona monitoring and Management

但它是一个基于服务器的系统,并且它的启动不是很简单。

并有现场演示系统进行测试。

MySQL命令:SHOW FULL PROCESSLIST;查看在任何给定时间正在处理哪些查询,但这可能无法实现您所希望的。

获得历史记录而不必修改使用服务器的每个应用程序的最佳方法可能是通过触发器。您可以设置触发器,以便每次查询运行都会导致查询被插入到某种历史表中,然后创建一个单独的页面来访问此信息。

请注意,这可能会大大降低服务器上的所有内容,因为在每个查询上都添加了一个额外的INSERT。


编辑:另一种选择是通用查询日志,但将其写入平面文件将消除许多灵活显示的可能性,特别是实时显示。如果您只是想要一种简单、易于实现的方法来查看发生了什么,那么启用GQL,然后在日志文件上运行tail -f就可以了。

我处于一种特殊的情况,我没有打开日志的权限,如果日志被打开,我也没有查看日志的权限。我不能添加触发器,但我确实有权限调用show processlist。所以,我尽了最大的努力,想出了这个:

创建一个名为"showsqlprocesslist"的bash脚本:

#!/bin/bash

while [ 1 -le 1 ]
do
         mysql --port=**** --protocol=tcp --password=**** --user=**** --host=**** -e "show processlist\G" | grep Info | grep -v processlist | grep -v "Info: NULL";
done

执行脚本:

./showsqlprocesslist > showsqlprocesslist.out &

尾部输出:

tail -f showsqlprocesslist.out

宾果得了。即使它没有节流,它只占用2-4%的CPU在我运行它的盒子上。我希望这能帮助到一些人。