我一直在看这篇文章 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个文件中?
注意:它不是我正在寻找的慢/长查询日志,而只是临时解决方案来读取为数据库运行的查询
答案 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