mysql中kill掉所有锁表的进程

时间:2024-05-18 21:03:18

在后台代码中书写的一个更新操作中,前端长时间没有得到响应,后来刷新前端页面后再次提交也是无法成功,后来就根据

后台日志信息,结果卡在了update一个表数据上,抛出了,等待锁超时尝试重启事务

Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException:
 Lock wait timeout exceeded; try restarting transaction

### 首先登陆mysql shell

$ mysql -u root -h 127.0.0.1 -p

$密码输入

### 查看mysql中现在执行的 所有线程

mysql>show processlist;    

   线程id       登陆用户    主机                                        数据库名称                   指令           时间   

mysql中kill掉所有锁表的进程

### kill 掉 指定的第一列线程id

mysql>kill thread_id;

#### 可以编写shell脚本执行如下

#!/bin/bash
mysql -u root -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

现在kill_thread_id.sql的内容像这个样子

kill 66402982;
kill 66402983;
kill 66402986;
kill 66402991;
.....

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

mysql>source kill_thread_id.sql

当然了, 也可以一行搞定

for id in `mysqladmin processlist | grep -i locked | awk '{print $1}'`
do
   mysqladmin kill ${id}
done

-----------------------------------------------------------------------------------------------------------------------------------

navcat下操作

mysql中kill掉所有锁表的进程

 

现在我们要查test库中使用情况,我们可以到information_schema中查询 
       解释:information_schema这张数据表保存了MySQL服务器所有数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。再简单点,这台MySQL服务器上,到底有哪些数据库、各个数据库有哪些表,每张表的字段类型是什么,各个数据库要什么权限才能访问,等等信息都保存在information_schema表里面。

我们可以用下面三张表来查原因: 
       innodb_trx ## 当前运行的所有事务 
       innodb_locks ## 当前出现的锁 
       innodb_lock_waits ## 锁等待的对应关系

此时我们在navcat中操作如下的指令,就会看到所有先执行事务的语句操作,

然后我们找到状态 trx_state 被锁的状态,然后使用kill命令干掉它就可以

 

-- 查看 所有mysql 进程id
show full PROCESSLIST;

-- 查看mysql 事务处理列表
select * from information_schema.INNODB_TRX  


kill 14237

mysql中kill掉所有锁表的进程

这里会涉及到三种表