如何在我的Linux服务器上跟踪MySQL查询?
例如,我想要设置某种侦听器,然后请求一个web页面并查看引擎执行的所有查询,或者只是查看在生产服务器上运行的所有查询。我该怎么做呢?
如何在我的Linux服务器上跟踪MySQL查询?
例如,我想要设置某种侦听器,然后请求一个web页面并查看引擎执行的所有查询,或者只是查看在生产服务器上运行的所有查询。我该怎么做呢?
当前回答
斯特拉
查看实时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。
其他回答
斯特拉
查看实时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。
我处于一种特殊的情况,我没有打开日志的权限,如果日志被打开,我也没有查看日志的权限。我不能添加触发器,但我确实有权限调用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在我运行它的盒子上。我希望这能帮助到一些人。
看看mtop。
你可以在命令行中运行:
watch --interval=[your-interval-in-seconds] "mysqladmin -u root -p[your-root-pw] processlist | grep [your-db-name]"
将值[x]替换为您的值。
或者更好:
mysqladmin -u root -p -i 1 processlist;
运行这个方便的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