mysql 慢sql日志的解读排查

一 概述

1.MySQL的慢查询日志是MySQL提供的一种日志记录 ,它用来记录在 MySQL 中响应时间超过阀值的语句,具 体指 运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中
2. 具体指运行时间超过 long_query_time 值的 SQL ,则会被记录到慢查询日志中。 long_query_time的默认值为 10,意思是运行10秒以上的语句。
3.由他来查看哪些 SQL 超出了我们的最大忍耐时间值,比如一条 sql 执行超过 5 秒钟,我们就算慢 SQL ,希望能 收集超过5 秒的 sql ,结合之前 explain 进行全面分析。

二 方法一

2.1 查看慢sql日志

默认情况下, MySQL 数据库没有开启慢查询日志 ,需要我们手动来设置这个参数。
当然,如果不是调优需要的话,一般不建议启动该参数 ,因为开启慢查询日志会或多或少带来一定的性能影响。
慢查询日志支持将日志记录写入文件

 2.2 临时性操作步骤

1.查看mysql日志是否开启

SHOW VARIABLES LIKE '%slow_query_log%';

 默认是关闭的

2.开启mysql日志

set global slow_query_log=1;
SHOW VARIABLES LIKE '%slow_query_log%';

 3.设置阈值时间

1.查看默认的阈值

 2.设置阈值

扫描二维码关注公众号,回复: 13771578 查看本文章

set long_query_time=3

 4.关闭阈值

set global slow_query_log=0;
SHOW VARIABLES LIKE '%slow_query_log%';

  2.3 永久性操作步骤

1.linux版本:如永久生效需要修改配置文件 my.cnf [mysqld]下配置

[mysqld]
slow_query_log=1
slow_query_log_file=/var/lib/mysql/atguigu-slow.log
long_query_time=3
log_output=FILE
2.windows版本:如永久生效需要修改配置文件 my.ini  [mysqld] 下配置
[mysqld]
slow_query_log=1
slow_query_log_file=D:\mysql-5.7.21-winx64\data\LAPTOP-VC53HCIP-slow.log
long_query_time=3
log_output=FILE

  2.4 从慢sql日志文件中找出慢sql

运行查询时间长的 sql ,打开慢查询日志查看

2.5 分析慢sql的工具mysqldump

按照上面配置后,找到慢sql的生成目录,使用mysqldump工具进行排查

案例:

得到返回记录集最多的 10 SQL
mysqldumpslow -s r -t 10 /var/lib/mysql/lala-slow.log
得到访问次数最多的 10 SQL
mysqldumpslow -s c -t 10 /var/lib/mysql/atguigu-slow.log
得到按照时间排序的前 10 条里面含有左连接的查询语句
mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/atguigu-slow.log
另外建议在使用这些命令时结合 | more 使用 ,否则有可能出现爆屏情况
mysqldumpslow -s r -t 10 /var/lib/mysql/atguigu-slow.log | more

三  方法二 SHOW PROCESSLIST 

3.1 show processlist

一般用到 show processlist 或 show full processlist 都是为了查看当前 mysql 是否有压力,都在跑什么语句,当前语句耗时多久了,有没有什么慢 SQL 正在执行之类的,可以看到总共有多少链接数,哪些线程有问题(time是执行秒数,时间长的就应该多注意了),然后可以把有问题的线程 kill 掉,这样可以临时解决一些突发性的问题。

show full processlist 返回的结果是实时变化的,是对mysql链接执行的现场快照,所以用来处理突发事件非常有用。

3.2 show processlist参数结果的分析

show full processlist命令的详解

第二种 通过navicat的工具进行查看

 参数详解:

Id:链接mysql 服务器线程的唯一标识,可以通过kill来终止此线程的链接。

User:当前线程链接数据库的用户

Host:显示这个语句是从哪个ip 的哪个端口上发出的。可用来追踪出问题语句的用户

db: 线程链接的数据库,如果没有则为null

Command: 显示当前连接的执行的命令,一般就是休眠或空闲(sleep),查询(query),连接(connect)

-- 查询非 Sleep 状态的链接,按消耗时间倒序展示,自己加条件过滤
select id, db, user, host, command, time, state, info
from information_schema.processlist
where command != 'Sleep'
order by time desc 

Time: 线程处在当前状态的时间,单位是秒

State:显示使用当前连接的sql语句的状态,很重要的列,后续会有所有的状态的描述,请注意,state只是语句执行中的某一个状态,一个 sql语句,已查询为例,可能需要经过copying to tmp table,Sorting result,Sending data等状态才可以完成

Info: 线程执行的sql语句,如果没有语句执行则为null。这个语句可以使客户端发来的执行语句也可以是内部执行的语句

由于Command的状态大部分都是sleep对我们分析问题没什么作用,所以我们可以通过如下语句来排除sleep状态的线程:

-- 查询非 Sleep 状态的链接,按消耗时间倒序展示,自己加条件过滤
select id, db, user, host, command, time, state, info
from information_schema.processlist
where command != 'Sleep'
order by time desc 

这样就过滤出来哪些是正在干活的,然后按照消耗时间倒叙展示,排在最前面的,极大可能就是有问题的链接了,然后查看 info 一列,就能看到具体执行的什么 SQL 语句了,针对分析 

3.3 kill掉有问题的线程

查询 mysql 进程列表,可以杀掉故障进程

 3.4总结

总结了一些常见问题:

CPU报警:很可能是 SQL 里面有较多的计算导致的

连接数超高:很可能是有慢查询,然后导致很多的查询在排队,排查问题的时候可以看到”事发现场“类似的 SQL 语句一大片,那么有可能是没有索引或者索引不好使,可以用:explain 分析一下 SQL 语句

Mysql show processlist 排查问题 - 都市烟火 - 博客园

猜你喜欢

转载自blog.csdn.net/u011066470/article/details/123834567
今日推荐