mysql show processlist,kill pid,查看连接数 查看被锁的表详解数据库

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

(0)
上一篇 2021年7月16日
下一篇 2021年7月16日

相关推荐

发表回复

登录后才能评论