项目在上线之后,经常会有客户反馈某个页面查询很慢,解决方案是我们找到对应的SQL来分析索引问题,其实解决起来并不麻烦,但是给客户造成的体验就不好了,大部分执行效率比较差的语句应该是在开发或者测试阶段就优化完成的,mysql提供了慢查询日志,默认是关闭的,可以通过my.cnf(my.ini)来配置打开
log_slow_queries = /var/log/mysql/mysql-slow.log
long_query_time = 1
参数一眼就能看明白了,完了以后需要重启mysql服务,根据配置,如果一条查询语句执行时间超过1秒,就会在日志文件中记录下来。
文件有了,但是要求开发人员每天登录到服务器上看那些语句执行慢肯定是不现实的,所以我通过邮件的形式把这个文件发出来
linux上发邮件的工具有很多,我这里用的是mutt,也是我跟sendmail比较之后觉得相对好用的,安装很简单
sudo apt-get install mutt
接下来就是发送邮件,我是通过shell脚本结合cron来定时发送的,关于shell脚本有个不错的教程 http://c.biancheng.net/cpp/shell/,脚本如下
#!/bin/bash
file="/var/log/mysql/mysql-slow.log"
tmpFile="/home/b2b/logs/mysql-slow-result.log"
#create the $tmpFile
if [ ! -e $tmpFile ]
then echo "$tmpFile doesn't exist, will create it";touch $tmpFile
else > $tmpFile
fi
#copy content from $file to $tmpFile
if [ -s $file ]
then cat $file > $tmpFile; > $file
fi
#send email
if [ -s $tmpFile ]
then echo -e "Hello Administrator, \nthis is the slow query log from 192.168.0.169, please check it!" | mutt -s "Slow Query" -a $tmpFile -e "my_hdr From:Pracbiz<[email protected]>" -- [email protected]; echo "Slow Query Email send Successfully"
else echo "No slow query logs need to send"
fi
脚本会建立一个临时文件mysql-slow-result.log,每次把mysql-slow.log内容拷贝到临时文件,然后把mysql-slow.log清空,最后把这个临时文件作为附件发出去,这样做的好处时每次发送的内容都是新生成的,如果日志为空则不发送邮件。
脚本保存为slowQuery.sh,需要执行
sudo chmod +x slowQuery.sh
让脚本可执行。
最后把任务添加到cron中
0 0 * * * /home/b2b/script/slowQuery.sh