最近遇到MySQL 报警,cpu突然飙高的情况,上去想看看是什么原因,运维找了过来。这个过程接触了 show processlist,于是整理和记录一下。
MySQL使用show processlist查看正在执行的SQL语句,通过show processlist查看正在执行的sql的情况以及及时kill死锁的SQL,通过EXPLAIN分析需要优化的sql语句。
命令行登录MySQL
mysql -u root -p -P 3306
之后输入密码即可。
查看执行的SQL语句
mysql> show processlist;
得到的结果,类似这样的:
+----+-----------------+-----------+------+---------+---------+------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-----------------+-----------+------+---------+---------+------------------------+------------------+
| 4 | event_scheduler | localhost | NULL | Daemon | 1122260 | Waiting on empty queue | NULL |
| 10 | root | localhost | NULL | Query | 0 | starting | show processlist |
+----+-----------------+-----------+------+---------+---------+------------------------+------------------+
2 rows in set (0.01 sec)
如何定位
当MySQL繁忙的时候运行show processlist,会发现有很多行输出,每行输出对应一个MySQL连接。怎么判断发起连接的进程是哪个?它当前正在做什么任务,执行什么SQL呢?
首先,需要通过TCP Socket而不是Unix Socket连接MySQL,这样在show processlist的输出中就会有来源端口号。
lsof查看端口号
lsof -i:78934 #查看端口连接情况
(完)