配置起来非常简单 到 vi /etc/my.cnf 进行配置 切记一定要配置到 [mysqld] 下面
# mysql 慢日志查询配置
# 是否已经开启慢查询
slow_query_log=on
# 慢查询日志文件路径
slow_query_log_file=/home/mysql/log/mysql-slow.txt
# 超过多少秒的查询就写入日志
long_query_time=1
常用参数:
slow_query_log : 无效(0或者OFF)、有效(1或者ON)
slow_query_log_file : 指定日志文件
long_query_time : 超过指定时间的SQL会记录到日志文件(默认时间为10秒)
log_output : 日志存放的地方 参数(TABLE ,FILE) 表示将日志存入文件,默认值是'FILE' log_output='TABLE'表示将日志存入数据库,这样日志信息就会被写入到mysql.slow_log表中.
log_queries_not_using_indexes: 是否指定未使用索引的SQL
然后重启mysql
systemctl start mysqld.service
然后到navicat 客户端查询:
show variables like '%query%';
这个参数为 ON 就已经打开了
我这里有个问题:上午的时候我在公司,用公司测试系统服务器进行慢日志配置的时候,当我在 my.cnf 里面进行修改的时候,修改完重启以后是可以生效的,但是晚上我用自己的服务器,修改后重启就发现不能生效,任何配置均不生效, 可以看到我上面配置文件图片所放的路径,和下面图片查出来 路径是不一致的(下图的是mysql 默认给的文件),这就是没有不生效,我就百度了一下,尝试了各种方法
1.文件权限不足
刚开始的时候确实只有只读,我为了测试,就直接赋予的 777 权限
chmod -R 777 /home/mysql/log/mysql-slow.txt
然后重启,发现还是没有效果,
2.mysql 配置读取不一定是当前的配置文件
查找命令如下:
# 拿到mysql 按装地址
which mysql
然后:
/usr/bin/mysql --verbose --help | grep -A 1 'Default options'
然后我就一个一个的试了试,除了/etc/my.cnf 外其他均没找到具体文件
这样就得出结论 我配置的慢日志查询没有生效。所以可能跟我使用的数据库版本有关,我使用的是 5.7.29 公司使用的是哪个版本,我也没太注意
然后接着上面,配置文件不生效的情况下,我是如何开启的:
虽然配置不管用,还好命令管用
#开启慢日志查询
SET GLOBAL slow_query_log =on;
# 设置查询阈值
SET GLOBAL long_query_time = 10
这里有个细节需要注意一下,就是 默认阈值是10秒,但是当我修改为1秒的时候,再查询但是显示的结果并为生效,直到我又重新打开一个查询的窗口的时候,再执行
show variables like '%query%';
发现 这个阈值已经发生变化
然后我又尝试修改了一下日志存放地址:
SET GLOBAL slow_query_log_file ="/home/mysql/log/mysql-slow.txt"
结果报了这个错误:
Variable 'slow_query_log_file' can't be set to the value of '/home/mysql/log/mysql-slow.txt'
我查了一下,说是这个文件不存在,或者权限不足,我777的权限,我也不能说啥了,就这样吧,就用默认的文件吧,然后验证一下
SELECT SLEEP(11)
然后读取慢日志
发现已经可以取到这个慢查询的SQL了
mysql 慢查询的日志分析工具还有多种,我目前用的是 mysqldumpslow
mysqldumpslow是官方提供的perl脚本
执行命令:
# 分析慢查询日志中前3条命令:
mysqldumpslow -t 3 /var/lib/mysql/localhost-slow.log
但是我执行的时候 报了:
-bash: /usr/bin/mysqldumpslow: /usr/bin/perl: bad interpreter: No such file or directory
应该是差包,这下我就更加确信了,版本的差异问题,因为我上午再公司使用这个命令的时候,并没有提示这个问题,我本来已经准备好迎接这个问题了,结果没有提示
mysqldumpslow 有个缺点就是,当你执行的SQL有动态参数传入的时候 他就显示 N 例如分页就显示 N,N这样是不太友好 所以可以使用其他的分析慢日志的工具,对于我来说,我觉得cat 命令就足够了