1 解析show processlist
1. 作用
就是查看当前mysql正在执行的进程,主要有两个作用:
(1)查看慢查询的sql是哪个
(2)查看出现锁的sql是哪个
2. 查看命令
mysql> show processlist;
+-----+-------------+--------------------+-------+---------+-------+
| Id | User | Host | db | Command | Time| State | Info
+-----+-------------+--------------------+-------+---------+-------+
|207|root |192.168.0.20:51718 |mytest | Sleep | 5 | | NULL
1
2
3
4
5
6
7
8
9
mysql>showprocesslist;
+-----+-------------+--------------------+-------+---------+-------+
|Id|User|Host |db |Command|Time|State |Info
+-----+-------------+--------------------+-------+---------+-------+
|207|root|192.168.0.20:51718|mytest|Sleep |5 | |NULL
有时候,无法显示出完整的sql,可以通过如下命令显示出完整的sql
mysql> show full processlist \G;
*************************** 1. row ***************************
Id: 19161
User: root
Host: 172.21.195.56:58045
db: NULL
Command: Query
Time: 434
State: updating
Info: delete FROM fee_statistics.user_asset_daily where settle_date > '2017-04-26' and settle_date < '2017-05-01'
1
2
3
4
5
6
7
8
9
10
mysql>showfullprocesslist\G;
***************************1.row ***************************
Id:19161
User:root
Host:172.21.195.56:58045
db:NULL
Command:Query
Time:434
State:updating
Info:deleteFROMfee_statistics.user_asset_dailywheresettle_date>'2017-04-26'andsettle_date
3. command字段
该字段的取值主要有:query和sleep两种结果。
(1)关注就是query命令。
(2)值为 sleep的理解
sleep是在等待prestatement(sql语句),它已经建立了connect,但是还没有开始执行,所以sleep状态多的话,那么数据库连接池就会被占用。所以:有时候sleep增多的原因可能是慢查询sql,但是sleep不是慢查询,因为它还没有开始执行。
4. state字段
关心的值是locked
2 查看慢查询
1. 慢查询,针对的是超过一定时间的查询。所以此时只需要关注两个因素:
(1)command字段,值为query表示的是查询操作。
(2)time字段,显示的查询时间。
2. 从网上找到的kil慢查询的方法
(1)第一步 查找出慢查询sql对应的进程id
select id from prosslist where COMMAND = 'query' and time > 60*10
1
selectidfromprosslistwhereCOMMAND='query'andtime>60*10
time字段的单位是秒,上面是查找10分钟慢查询sql
(2)第二步 kill掉查找到慢查询,在mysql客户端执行如下:kill 3;
3 查看死锁
可以查看state为“locked”的状态的查询,就是死锁的查询,然后通过info字段获取这个sql语句。
1. 延伸:一个kill死锁的进程的脚本
(1)第一步
mysql -u root -e "show processlist" | grep -i "Locked" >> locked_log.txt
1
mysql-uroot-e"show processlist"|grep-i"Locked">>locked_log.txt
(2)第二步
for line in `cat locked_log.txt | awk '{print $1}'`
do
echo "kill $line;" >> kill_thread_id.sql
done
1
2
3
4
forlinein`catlocked_log.txt|awk'{print $1}'`
do
echo"kill $line;">>kill_thread_id.sql
done
现在kill_thread_id.sql的内容像这个样子 kill 66402982;