新建 MySQL 用户

创建用于刷新日志的 MySQL 账号,并对账号权限加以限制。

> GRANT RELOAD ON *.* TO 'flushlogs_user'@'localhost' IDENTIFIED BY '123456';
> FLUSH PRIVILEGES;

刷新 MySQL 慢日志

刷新MySQL慢查询日志,慢查询日志类型为 slow

# 方式一
$ mysqladmin -u$DBUser -P$DBPass -S /data/server/mysql/tmp/mysql.sock flush-logs slow

# 方式二
$ mysqladmin -u$DBUser -P$DBPass -h $DBHost -P $DBPort flush-logs slow

注意

在刷新 slow log 前,需要先把文件重命名,否则mysql不会生成新的 slow log 文件。

由于在Linux系统中存在“文件描述符”的概念,即使重命名了 slow log 文件,mysql进程依然会把新产生的慢日志写入重命名后的 slow log 文件中。所以需要在刷新 slow log 之前先进行重命名操作,然后刷新 slow log,这样mysql才会生成新的 slowlog 文件并把慢日志写入到该文件中。

慢日志切割脚本

在MySQL实例中添加慢日志切割脚本 logrotate-mysql-slowlog.sh

#/bin/bash
# Author: wanhebin
# UpdateTime: 2022/10/20
# Description: 切割 MySQL 慢查询日志。

DateTime=`date +%Y%m%d%H%M%S`
DBHost='localhost'
DBPort=3306
DBUser='flushlogs_user'
DBPass='123456'
SocketFile='/var/lib/mysql/mysql.sock'
SlowLogDir='/data/service/mysql/data'
SlowLogFile='mysql-slow.log'
SlowLogBakDir='/data/backup/mysql-backup/slowlog'
SlowLogBakFile="${SlowLogFile}-${DateTime}"

# 判断慢日志备份目录是否存在,没有则创建
[ -d $SlowLogBakDir ] || mkdir -p $SlowLogBakDir

# 判断MySQL实例是否可以正常连接
/usr/local/mysql/bin/mysqladmin ping -u$DBUser -p$DBPass -S $SocketFile &>/dev/null;ReturnValue=`echo $?`
if [ $ReturnValue -ne 0 ]; then
echo -e "MySQL实例无法连接,退出脚本!!!"
exit 1
fi

# 重命名 Slow log 文件
mv $SlowLogDir/$SlowLogFile $SlowLogDir/$SlowLogBakFile

# 刷新 slow log
/usr/local/mysql/bin/mysqladmin -u$DBUser -p$DBPass -S $SocketFile flush-logs slow

# 拷贝刷新前重命名的 slow log 到备份目录下
mv $SlowLogDir/$SlowLogBakFile $SlowLogBakDir/
gzip $SlowLogBakDir/$SlowLogBakFile

添加定时任务

# 切割 MySQL 慢查询日志
58 23 */7 * * /bin/sh /opt/shell/logrotate-mysql-slowlog.sh &>/opt/shell/logs/logrotate-mysql-slowlog.log