一台 4 核 16G 的 MySQL 5.7 上,慢日志一天涨八 G,磁盘只剩十几 G,翻开头几页发现大量 Query_time 0.001 的语句,扫描行数上千却一行都没返回,业务本身并不慢。
原因不止一个,得分开看。log_queries_not_using_indexes 打开了,凡是没走索引的语句不管多快都写进慢日志;报表任务里有定时全表扫描,每一轮都往日志里灌几万条;long_query_time 设得太小,正常语句也被算成慢查询;日志没有按大小轮转,单文件一直往同一个 inode 追加。
动手时先看增量到底是条数多还是单条太长
du -sh /var/log/mysql/slow.log && grep -c 'Query_time' /var/log/mysql/slow.log
接着关掉记录未用索引语句的开关
mysql -e 'set global log_queries_not_using_indexes=OFF;'
随后把慢查询阈值调到业务能接受的量级
mysql -e 'set global long_query_time=1; show variables like "long_query_time";'
剩下的就是配一个按大小切割的轮转,避免单文件无限长
printf '/var/log/mysql/slow.log {\n size 500M\n rotate 5\n compress\n missingok\n}\n' > /etc/logrotate.d/mysql-slow
恢复的判定其实很直接。慢日志每小时增量降到五十 M 以内,Query_time 的条数下降两个数量级,df 显示磁盘可用空间不再持续减少,报表任务耗时没有变化。
把未用索引的语句关掉会丢掉优化线索,更好的做法是单独开一个采样日志,而不是让它和慢查询混在一起。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
