作为一个开发人员或者数据库管理员,学会检查数据库运行情况是必不可少的工作。造成MySQL线程卡顿的原因有很多,但是无论是哪种原因,我们发现问题之后的第一要务就是解决问题,防止问题继续恶化。那么,应该如何操作?
查找线程
有两种方法可以查看正在运行的线程。
-
进入到mysql/bin目录下,执行mysqladmin processlist
-
连上MySQL,输入show processlist;命令查看
- show variables like "%max_connections";
我们用Navicat登录localhost简单看一下,结果如下:
结果中每一行对应一个连接,每一列的含义如下:
Id:thread_id,线程id;
User:用户,如果你不是root,那么只能看到权限范围内的SQL;
Host:可以看到来源IP和端口,结合netstat或lsof命令可快速定位进程;
db:当前DB实例;
Command:当前执行的命令,通常是sleep、query、connect ;
Time:当前状态持续了多少秒;
State:当前状态;
Info:当前语句;
如果是连接数太小了,可以适当修改一下,超时时间太长的话同样直接改小就行。
其次,用户增长太猛,这个时候就需要添加机器了。
杀死线程
执行kill id命令即可杀死卡顿的线程
常见原因
造成线程卡顿的原因有很多,但是很多时候通常只有两种:
-
锁竞争
-
慢查询