Mysql show processlist

来自linux中国网wiki
跳到导航 跳到搜索

show processlist

先简单说一下各列的含义和用途,第一列, id , 不用说了吧,一个标识,你要 kill 一个语句的时候很有用。 user列, 显示单前用户,如果不是 root ,这个命令就只显示你权限范围内的 sql 语 句。 host 列,显示这个语句是从哪个 ip 的哪 个端口上发出的。呵呵,可以用来追踪出问题语句的用户。 db 列,显示这个进程目前连接的是 哪个数据库 。command 列,显示当前连接的执行的命令,一般就是休眠( sleep ),查询( query ),连接( connect )。 time 列,此这个状态持续的时间,单位是秒。 state 列,显示使用当前连接的 sql 语句的状态,很重要的列,后续会有所有的状态的描述,请注意, state 只是语句执行中的某一个状态,一个 sql 语 句,已查询为例,可能需要经过 copying to tmp table ,Sorting result , Sending data 等状态才 可以完成, info 列,显示这个 sql 语 句,因为长度有限,所以长的 sql 语句就显示不全,但是一个判断问题语句的重要依据。

 

当MySQL繁忙的时候运行show processlist,会发现有很多行输出,每行输出对应一个MySQL连接。怎么诊断发起连接的进程是哪个?它当前正在干嘛呢?

首先,需要通过TCP Socket而不是Unix Socket连接MySQL,这样在show processlist的输出中就会有来源端口号。如下,

mysql> show processlist;
+——–+——–+—————–+——+———+——+——-+——————+
| Id | User | Host | db | Command | Time | State | Info |
+——–+——–+—————–+——+———+——+——-+——————+
| 277801 | mydbuser | localhost:35558 | mydb | Sleep | 1 | | NULL |
| 277804 | mydbuser | localhost:35561 | mydb | Sleep | 1 | | NULL |
| 277805 | mydbuser | localhost:35562 | mydb | Sleep | 0 | | NULL |
+——–+——–+—————–+——+———+——+——-+——————+

在Host列有来源IP和端口号,然后我们从连接机器查看端口号是谁打开的,

[root@localhost ~]# netstat -ntp | grep 35558
… 124.115.0.68:35558 ESTABLISHED 18783/httpd

可知进程18783发起的MySQL连接来源端口是35558,然后就可以用strace观察这个进程了。如果是Apache的PHP脚本,还可以 用proctitle模块( http://pecl.php.net/package/proctitle/ )设置脚本的状态信息。

lsof也能根据端口号显示进程号,细节请参考手册。



取消会话或查询

您可使用 rds_kill 和 rds_kill_query 命令终止数据库实例上的用户会话或查询。首先连接到 MySQL 数据库实例,然后发出正确的命令,如下所示。有关更多信息,请参阅 与运行 MySQL 数据库引擎的数据库实例连接。

CALL mysql.rds_kill(thread-ID)
CALL mysql.rds_kill_query(thread-ID) 

例如,要取消线程 99 上运行的会话,可以键入以下内容:

CALL mysql.rds_kill(99); 

要取消线程 99 上运行的查询,可以键入以下内容:

CALL mysql.rds_kill_query(99); 



参考

MySql使用show processlist查看正在执行的Sql语句

mysql kill process解决死锁

http://www.cnblogs.com/jasondan/p/3491258.html http://www.51testing.com/html/96/110296-69546.html https://dev.mysql.com/doc/refman/5.7/en/general-thread-states.html show processlist命令与kill 线程

MySQL 数据库实例的数据库管理员常见任