show processlist
show [full] processlist
;
展示属于当前用户的线程,如果当前用户有 process privilege,那么会展示所有线程。
如果不加full,只显示前100条;show processlist展示的线程不包含background thread,所以线程数就等于connections
- id,connection的id
- user,发送sql的mysql 账号
- host,发送sql的客户端,一般是ip:port格式
- db,sql连接的数据库
- command,connection正在执行的命令类型,常见的有Sleep,表示connection空闲;query,正在查询数据。
- time,线程已经执行的时间,单位是秒。如果是replica SQL thread,那么就是最后一次replicated event 和replica host的差值。
- State,一个事件、一个动作、一个状态,表示线程正在做的事情,通常一个状态对应着很快的操作,如果一个状态持续了很长时间,通常有问题,需要研究一下了。
- Info,线程正在执行的sql,通常是客户端发过来的sql,也可能是客户端发过来sql引起的sql,比如客户端发送调用存储过程,那么这里展示存储过程的sql。
还可使用show status like '%threads_%';
threads_connected就是当前线程数,也是连接数,与show processlist的记录数相同。
查看被打开的表
show open tables where in_use>0;
这里有个疑问,这个sql查出来的表,不一定是被锁住的。因为用查询,如果耗费时间很长,也会查询出来。
这里的open tables是什么意思? 每次操作(查询、更新、增加、删除)都会打开表,一个线程一个connection
为了维护不同的状态,他们分别打开表,这就是open tables,所以说open tables说明在操作表,如果表锁了,这个sql是正确的。
可以使用 show status like '%Opened_tables%'
;查看已经打开的表
活学活用show status和show variables,一个是查看mysql当前状态,一个是查看环境变量;
杀死链接
KILL [CONNECTION | QUERY] processlist_id
不加modifier等同于kill connection
kill query pid,是杀死connection中的sql,不杀死connection
总结
先通过show processlist
查看执行时间最长的线程,找到对应sql,找到表;
然后再使用show open tables where in_use>0
验证一下;
确认后,使用kill process_id
杀死connection
参考
http://dev.mysql.com/doc/refman/5.7/en/show-processlist.html
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/3739.html