如何记录特定数据库的mysql查询 - Linux

时间:2015-07-31 22:30:38

标签: mysql linux ssh server hosting

我一直在看这篇文章 How can I log "show processlist" when there are more than n queries?

运行此命令

工作正常
mysql -uroot -e "show full processlist" | tee plist-$date.log | wc -l

它覆盖文件的问题

我也想在cronjob中运行它。

我已将此命令添加到/var/spool/cron/root

* * * * * [ $(mysql -uroot -e "show full processlist" | tee plist-`date +%F-%H-%M`.log | wc -l) -lt 51 ] && rm plist-`date +%F-%H-%M`.log

但它不起作用。或者它可能将日志文件保存在根文件夹之外的某个位置。

所以我的问题是:如何临时记录来自特定数据库和特定表的所有查询,并将整个查询保存在1个文件中?

注意:它不是我正在寻找的慢/长查询日志,而只是临时解决方案来读取为数据库运行的查询

2 个答案:

答案 0 :(得分:0)

%字符在crontab命令中具有特殊含义,您需要将它们转义。所以你需要这样做:

* * * * * [ $(mysql -uroot -e "show full processlist" | tee plist-`date +\%F-\%H-\%M`.log | wc -l) -lt 51 ] && rm plist-`date +\%F-\%H-\%M`.log

如果您想使用原始命令,但不是每次都覆盖该文件,可以使用-a的{​​{1}}选项追加:

tee

要每秒运行一分钟,请编写一个shell脚本:

mysql -uroot -e "show full processlist" | tee -a plist-$date.log | wc -l

然后您可以每分钟从cron运行此脚本:

#!/bin/bash
for i in {1..60}; do
    [ $(mysql -uroot -e "show full processlist" | tee -a plist.log | wc -l) -lt 51 ] && rm plist.log
    sleep 1
done

虽然如果你想连续运行这样的东西,* * * * * /path/to/script 可能不是最好的方法。您可以在系统引导时使用cron来运行脚本,如果由于某种原因它会死亡,它将自动重新启动它。那么你只需要使用无限循环:

/etc/inittab

答案 1 :(得分:0)

解决方案是:

watch -n 1  "mysqladmin -u root -pXXXXX processlist | grep tablename"  | tee -a /root/plist.log