mysql中kill掉所有locked

当一个MySQL连接会话等待另外一个会话持有的互斥锁时,会发生Innodb锁等待情况。

通常情况下,持有该互斥锁的会话(连接)会迅速的执行完相关操作并释放掉持有的互斥锁,进而等待的会话在锁等待超时时间到来前获得该互斥锁,进行下一步操作。

但在某些情况下,比如一个实例未感知到的中断会话,持有该互斥锁的会话长时间不释放该互斥锁,可能会导致大量的锁等待与锁等待超时。


过年前某个客户的数据库服务器经常发生锁表(国内某棋牌运营商) 老有刷数据的 封了N 多IP 而且一刷就锁表,最主要的是zabbix监控到,负载300多,根本停不下来啊!!!!!!!!!!
mysql
>show processlist;

出来哗啦啦好几屏幕的, 没有一千也有几百条, 查询语句把表锁住了, 赶紧找出第一个Locked的thread_id, 在mysql的shell里面执行.


#!/bin/bash
mysql -u root -proot -e "show processlist" | grep -i "Locked" >> locked_log.txt

for line in `cat locked_log.txt | awk ‘{print $1}‘`
do
echo "kill $line;" >> kill_thread_id.sql
done


好了, 我们在mysql的shell中执行, 就可以把所有锁表的进程杀死了.

mysql>source kill_thread_id.sql


当然,这不是根本的解决办法,还是赶紧把具体的sql提交给开发人员,让他们呢改代码去吧!

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。