1.查看mysql日志是否开启, 默认是关闭的
SHOW VARIABLES LIKE '%slow_query_log%';
2.开启mysql日志
set global slow_query_log=1;
SHOW VARIABLES LIKE '%slow_query_log%';
3.设置阈值时间
3.1.查看默认的阈值
3. 2.设置阈值
set long_query_time=3
4.关闭mysql的慢log日志
set global slow_query_log=0;
SHOW VARIABLES LIKE '%slow_query_log%';
1.linux版本:如永久生效需要修改配置文件 my.cnf 中[mysqld]下配置
按照上面配置后,找到慢sql的生成目录,使用mysqldump工具进行排查
案例:
一般用到 show processlist
或 show full processlist
都是为了查看当前 mysql 是否有压力,都在跑什么语句,当前语句耗时多久了,有没有什么慢 SQL 正在执行之类的,可以看到总共有多少链接数,哪些线程有问题(time是执行秒数,时间长的就应该多注意了),然后可以把有问题的线程 kill 掉,这样可以临时解决一些突发性的问题。
show full processlist 返回的结果是实时变化的,是对mysql链接执行的现场快照,所以用来处理突发事件非常有用。
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 语句了,针对分析
总结了一些常见问题:
CPU报警:很可能是 SQL 里面有较多的计算导致的
连接数超高:很可能是有慢查询,然后导致很多的查询在排队,排查问题的时候可以看到”事发现场“类似的 SQL 语句一大片,那么有可能是没有索引或者索引不好使,可以用:explain
分析一下 SQL 语句
Mysql show processlist 排查问题 - 都市烟火 - 博客园