本文介绍了MySQL产生大量慢查询日志导致磁盘空间异常、分析及解决的过程。
MySQL官方并未提供自动定时清理慢查询日志的策略,需要手工干预。
方法一,手动刷新日志:
关闭慢查询日志:
set global slow_query_log=off;手动刷新慢查询日志:
flush slow logs;重命名慢查询日志文件,删除或压缩:
mv /usr/local/mysql/data/mysql-slow.log /usr/local/mysql/mysql-slow-$(date +%Y-%m-%d).log
gzip -c /usr/local/mysql/mysql-slow-$(date +%Y-%m-%d).log > /var/lib/mysql/mysql-slow-$(date +%Y-%m-%d).log.gz开启慢查询日志:
set global slow_query_log=on;
方法二,自动刷新日志:
创建一个lograte文件:
touch /etc/logrotate.d/mysql
# 创建内容
/usr/local/mysql/data/mysql-slow.log {
size 2G
dateext
compress
missingok
rotate 30
notifempty
delaycompress
sharedscripts
nocopytruncate
create 660 mysql mysql
postrotate
/usr/bin/mysql -e 'select @@global.slow_query_log into @sq_log_save; set global slow_query_log=off; select sleep(5); FLUSH SLOW LOGS; select sleep(10); set global slow_query_log=@sq_log_save;'
endscript
rotate 250
}size: 保留的文件大小。
dateext,定义日志文件后缀为日期格式,比如nginx.log-20190707.gz。
如果该参数被注释掉,切割出来是按数字递增,比如nginx.log-1.gz。
missingok,在日志轮循期间,任何错误将被忽略,例如“文件无法找到”之类的错误。
notifempty:如果是空文件的话,不进行切割。
compress,在轮循任务完成后,已轮循的归档将使用gzip进行压缩。
delaycompress,指示logrotate不要将最近的归档压缩,压缩将在下一次轮循周期进行。
create 640 nginx adm,以指定的权限和用书属性,创建全新的日志文件,同时logrotate也会重命名原始日志文件。
postrotate/endscript,在所有其它指令完成后,postrotate和endscript里面指定的命令将被执行。
postrotate和endscrip这两个关键字必须单独成行。
测试滚动日志是否成功:
logrotate -vf /etc/logrotate.d/mysql要执行日志滚动,需要在mysql的配置文件中配置账户密码。