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

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


当前回答

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

$ mysqladmin -u bob -p -i 1 processlist

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

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

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

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

其他回答

斯特拉

查看实时MySQL/MariaDB查询的最快方法是使用调试器。在Linux上,你可以使用strace,例如:

sudo strace -e trace=read,write -s 2000 -fp $(pgrep -nf mysql) 2>&1

因为有很多转义字符,你可以通过管道将strace的输出格式化(只需在这两个一行程序之间添加|)到下面的命令中:

grep --line-buffered -o '".\+[^"]"' | grep --line-buffered -o '[^"]*[^"]' | while read -r line; do printf "%b" $line; done | tr "\r\n" "\275\276" | tr -d "[:cntrl:]" | tr "\275\276" "\r\n"

因此,您应该看到相当干净的SQL查询,没有时间,而不涉及配置文件。

显然,这不会取代下面描述的启用日志的标准方法(其中涉及到重新加载SQL服务器)。

目录

使用MySQL探针来查看实时的MySQL查询,而不需要接触服务器。示例脚本:

#!/usr/sbin/dtrace -q
pid$target::*mysql_parse*:entry /* This probe is fired when the execution enters mysql_parse */
{
     printf("Query: %s\n", copyinstr(arg1));
}

将上述脚本保存到一个文件(如watch.d),并运行:

pfexec dtrace -s watch.d -p $(pgrep -x mysqld)

了解更多信息:开始使用DTracing MySQL

Gibbs MySQL Spyglass

请看这个答案。

Logs

以下是对发展有用的步骤。

将这些行添加到~/.my.cnf或全局my.cnf中:

[mysqld]
general_log=1
general_log_file=/tmp/mysqld.log

路径:/var/log/mysqld.log或/usr/local/var/log/mysqld.log也可以工作,这取决于您的文件权限。

然后重新启动你的MySQL/MariaDB by(必要时加上sudo):

killall -HUP mysqld

然后检查你的日志:

tail -f /tmp/mysqld.log

完成后,将general_log更改为0(以便将来可以使用它),然后删除文件并重新启动SQL server: killall -HUP mysqld。

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

SET GLOBAL log_output = 'FILE';

默认设置为“NONE”。

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

$ mysqladmin -u bob -p -i 1 processlist

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

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

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

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

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

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

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


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

Gibbs MySQL Spyglass

AgilData最近推出了Gibbs MySQL可伸缩性顾问(一个免费的自助服务工具),它允许用户捕获实时查询流并上传到Gibbs。Spyglass(它是开源的)将监视MySQL服务器和客户端应用程序之间的交互。不需要重新配置或重新启动MySQL数据库服务器(无论是客户端还是应用程序)。

GitHub: AgilData / gibbs-mysql-spyglass

了解更多:包捕获MySQL与Rust

安装命令:

curl -s https://raw.githubusercontent.com/AgilData/gibbs-mysql-spyglass/master/install.sh | bash