1 解析show processlist
1. 作用
就是查看当前mysql正在执行的进程,主要有两个作用:
(1)查看慢查询的sql是哪个
(2)查看出现锁的sql是哪个
2. 查看命令
1 2 3 4 5 6 7 8 9 |
mysql> show processlist; +-----+-------------+--------------------+-------+---------+-------+ | Id | User | Host | db | Command | Time| State | Info +-----+-------------+--------------------+-------+---------+-------+ |207|root |192.168.0.20:51718 |mytest | Sleep | 5 | | NULL |
有时候,无法显示出完整的sql,可以通过如下命令显示出完整的sql
1 2 3 4 5 6 7 8 9 10 |
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' |
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
1 |
select id from prosslist where COMMAND = 'query' and time > 60*10 |
time字段的单位是秒,上面是查找10分钟慢查询sql
(2)第二步 kill掉查找到慢查询,在mysql客户端执行如下:kill 3;
3 查看死锁
可以查看state为“locked”的状态的查询,就是死锁的查询,然后通过info字段获取这个sql语句。
1. 延伸:一个kill死锁的进程的脚本
(1)第一步
1 |
mysql -u root -e "show processlist" | grep -i "Locked" >> locked_log.txt |
(2)第二步
1 2 3 4 |
for line in `cat locked_log.txt | awk '{print $1}'` do echo "kill $line;" >> kill_thread_id.sql done |
现在kill_thread_id.sql的内容像这个样子 kill 66402982;