默认关闭,除非需要查看慢sql日志,平时不要打开
以下设置都是临时有效,重启数据库后会失效,想要永久生效需要修改配置文件进行配置
参数说明
- slow_query_log 慢查询开启状态
- slow_query_log_file 慢查询日志存放的位置(这个目录需要MySQL的运行帐号的可写权限,一般设置为MySQL的数据存放目录)
- long_query_time 查询超过多少秒才记录
查看慢查询日志状态及存储路径:
SHOW VARIABLES LIKE 'slow_query_log%';
SHOW VARIABLES LIKE 'long_query_time'; -- 查看慢查询超时时间
结果:
slow_query_log ON
slow_query_log_file /var/lib/mysql/88eec0ff40aa-slow.log
long_query_time 10.000000
设置方法
方法1:全局变量设置(临时)
打开慢查询日志:
SET GLOBAL slow_query_log=1
设置慢查询日志超时时间:
SET GLOBAL long_query_time=3 # 设置为3秒,需要重新连接或打开一个新的会话,才能查看新设置的超时时间
方法2:配置文件设置
修改配置文件my.cnf
,在[mysqld]
下的下方加入
[mysqld]
slow_query_log = ON
slow_query_log_file = /usr/local/mysql/data/slow.log
long_query_time = 1
重启MySQL服务
测试
模拟一个慢查询sql,方便测试:
SELECT sleep(4);
查看有几条慢sql:
SHOW GLOBAL STATUS LIKE '%slow_queries%'
服务器上查询生成的慢查询日志
ls /usr/local/mysql/data/slow.log
慢sql日志分析工具mysqldumpslow
mysqldumpslow工具是mysql自带的,不需要安装
慢查询日志在/var/lib/mysql/
目录下,文件名xxxxxx-slow.log
mysqldumpslow -t 10 /var/lib/mysql/xxxxxx-slow.log --查前十行
可以查询如下信息:
- s:表示何种方式排序
- c:访问次数
- l:锁定时间
- r:返回记录数
- t:查询时间
- al:平均锁定时间
- ar:平均返回记录数
- at:平均查询时间
- t:返回前面多少条数据
- g:后面搭配一个正则匹配模式,大小写不敏感
案例
mysqldumpslow -s c -t 10 /var/run/mysqld/5001144eef26-slow.log # 取出使用最多的10条慢查询
mysqldumpslow -s t -t 3 /var/run/mysqld/mysqld-slow.log # 取出查询时间最慢的3条慢查询
mysqldumpslow -s t -t 10 -g “left join” /database/mysql/slow-log # 得到按照时间排序的前10条里面含有左连接的查询语句
mysqldumpslow -s r -t 10 -g 'left join' /var/run/mysqld/mysqld-slow.log # 按照扫描行数最多的
慢日志查询分析工具:pt-query-digest
安装:wget https://www.percona.com/downloads/percona-toolkit/2.2.16/RPM/percona-toolkit-2.2.16-1.noarch.rpm && yum localinstall -y percona-toolkit-2.2.16-1.noarch.rpm
命令:
查看服务器信息
pt-summary
查看磁盘开销使用信息
pt-diskstats
查看mysql数据库信息
pt-mysql-summary --user=root -password=123456
分析慢查询日志
pt-query-digest /data/mysql/data/db-3-12-slow.log
查询mysql从库和同步状态
pt-slave-find --host=localhost --user=root --password=123456
查看mysql死锁信息
pt-deadlock-logger --user=root --password=123456 localhost
从慢查询日志中分析索引使用情况
pt-index-usage slow_20131009.log
查找数据库表中重复的索引
pt-duplicate-key-checker --host=localhost --user=root --password=123456
查看mysql表和文件的当前IO开销:
pt-ioprofile
查找数据库里大于2G的表:
pt-find --user=root --password=123456 --tablesize +2G
查看表和索引大小并排序:
pt-find --user=root --password=123456 --printf "%T\t%D.%N\n" | sort -rn
显示查询时间大于60秒的查询:
pt-kill --user=root --password=123456 --busy-time 60 --print
kill掉大于60秒的查询
pt-kill --user=root --password=123456 --busy-time 60 --kill