MySQL慢查询使用FILE方式记录

mysql 数据库慢查询日志分析是优化数据库性能的重要方式之一,随着时间积累,慢查询日志会变得越来越大,作一个每天自动切割的任务,将脚本放在/etc/logrotate.d/下,步骤如下:

刷新慢查询日志的一般步骤
  1. 查看慢查询日志路径select @@datadir;
  2. 重命名慢查询日志mv a b
  3. 登陆数据库flush slow logs;

logrotate实现

修改my.cnf,方便自动轮询日志时候自动加载用户名密码

[client]
user=root
password=123456
socket=/var/lib/mysql/mysql.sock

在/etc/logrotate.d/下新建任务

# vim /etc/logrotate.d/mysql

输入以下内容:

/var/log/mysql/*log {
daily
rotate 7
missingok
notifempty
delaycompress
create 644 mysql mysql
postrotate
MYCNF_FILE=/root/.my.cnf
MYSQLADMIN=/usr/bin/mysqladmin
if test -x $MYSQLADMIN && $MYSQLADMIN --defaults-file="$MYCNF_FILE" ping >/dev/null
then
$MYSQLADMIN --defaults-file="$MYCNF_FILE" flush-logs
fi
endscript
}

重新加载cron配置

# service crond reload

这样子就新建好了慢查询日志每天分割,保留7天

crontab实现

#!/bin/bash
mysql=''
user=''
password=''
ip=''
archived_log=slow.`date +%Y%m%d%H`.log
slowlog=`$mysql -u$user -p$password -h$ip -e"show global variables like 'slow%';" 2> /dev/null | grep 'slow_query_log_file' | awk -F ' ' {'print $2'}`
datadir=`mysql -u$user -p$password -e"show global variables like 'data%';" 2> /dev/null | grep datadir | awk -F ' ' {'print $2'}`
echo $slowlog
echo $datadir
echo ${datadir}/${slowlog}
echo ${datadir}/${archived_log}
mv ${datadir}/${slowlog} ${datadir}/${archived_log}
$mysql -u$user -p$password -h$ip -e"flush slow logs"
echo "归档成功,路径为"{archived_log}

测试

[root@NB-flexgw1:/root]# bash -x auto_cut_mysqlslowlog.sh
+ mysql=mysql
+ user=root
+ password=root
+ ip=localhost
++ date +%Y%m%d%H
+ archived_log=slow.2020060211.log
++ mysql -uroot -proot -hlocalhost '-eshow global variables like '\''slow%'\'';'
++ grep slow_query_log_file
++ awk -F ' ' '{print $2}'
+ slowlog=dataslow.log
++ mysql -uroot -proot '-eshow global variables like '\''data%'\'';'
++ grep datadir
++ awk -F ' ' '{print $2}'
+ datadir=/alidata/mysql/data/
+ echo dataslow.log
dataslow.log
+ echo /alidata/mysql/data/
/alidata/mysql/data/
+ echo /alidata/mysql/data//dataslow.log
/alidata/mysql/data//dataslow.log
+ echo /alidata/mysql/data//slow.2020060211.log
/alidata/mysql/data//slow.2020060211.log
+ mv /alidata/mysql/data//dataslow.log /alidata/mysql/data//slow.2020060211.log
+ mysql -uroot -proot -hlocalhost '-eflush slow logs'
mysql: [Warning] Using a password on the command line interface can be insecure.
+ echo '归档成功,路径为{archived_log}'
归档成功,路径为{archived_log}

新的慢日志产生,对系统不会造成影响,查看归档后的日志

[root@NB-flexgw1:/root]# ll /alidata/mysql/data/slow*
-rw-r----- 1 mysql mysql 162702214 6月 2 11:40 /alidata/mysql/data/slow.2020060211.log