帮一个开发朋友实现一个功能:他希望 每天能定时发送前一天的TOP 10 的慢查询SQL 给研发的负责人。
因为不太懂数据库,所以最好不要安装第三方的工具。
因此用shell 写了一个脚本,把这个脚本加入到crontab里,即可实现每天发送前一天的TOP 10 慢查询。
#!/bin/bash
MYSQL=`which mysql`
MYSLOW=`which mysqldumpslow`
BACKUPUSER=root
BACKUPPASS=123456
BACKUPPORT=3306
BACKUPIP=127.0.0.1
#需要将/opt/data/3306/logs 替换为实际的慢查询日志的存放路径
LOG_FILE_NAME=/opt/data/3306/logs/`date +%Y%m%d`.log
#前一天的慢查询文件名
LAST_LOG_FILE_NAME=/opt/data/3306/logs/`date +%Y%m%d -d"-1 day"`.log
#存放TOP 10 慢查询的临时文件
MAIL_CONTENT_FILE=/opt/data/3306/logs/mail.log
#定义邮件的主题
SUBJECT="Daily Mysql Top10 Slow SQL `date +%F' '%T`"
#定义收件人的邮箱
EMAIL="Xxxxx@XXX.com"
mycmd="$MYSQL -u$BACKUPUSER -p$BACKUPPASS -h$BACKUPIP -P$BACKUPPORT "
# 因为默认mysql的慢查询日志会不断的增长,因此我们根据日期来设置每天的慢查询文件名。这样即可实现每天一个慢查询文件。
$mycmd -e "set global slow_query_log_file='$LOG_FILE_NAME'"
$MYSLOW -s t -t 10 $LAST_LOG_FILE_NAME>>$MAIL_CONTENT_FILE
/usr/bin/dos2unix $MAIL_CONTENT_FILE
/bin/mail -s "$SUBJECT" "$EMAIL"<$MAIL_CONTENT_FILE
rm -rf $MAIL_CONTENT_FILE
# 删除7天前的慢查询日志
rm -rf /opt/data/3306/logs/`date +%Y%m%d -d"-7 day"`.log