MySQL死锁问题如何分析&锁表后查看死锁和去除死锁

561 阅读1分钟

第1步 查看表是否在使用

如果查询结果为空。则证明表没有在使用。结束。

mysql>  show open tables where in_use > 0 ;
Empty set (0.00 sec) 

第2步 查看数据库当前的进程

show processlist 是显示用户正在运行的线程,需要注意的是,除了 root 用户能看到所有正在运行的线程外,其他用户都只能看到自己正在运行的线程,看不到其它用户正在运行的线程。

mysql> show processlist;
Id |User           |Host               |db    |Command|Time |State                 |Info                                                                        |
---+---------------+-------------------+------+-------+-----+----------------------+----------------------------------------------------------------------------+
  5|event_scheduler|localhost          |      |Daemon |86296|Waiting on empty queue|                                                                            |
253|root           |localhost:55059    |      |Sleep  | 5853|                      |                                                                            |
254|root           |localhost:55060    |      |Sleep  | 5853|                      |                                                                            |
262|nacos          |192.168.147.7:44036|nacos |Sleep  |   10|                      |                                                                            |
263|nacos          |192.168.147.7:44038|nacos |Sleep  |   11|                      |                                                                            |

第3步 当前运行的所有事务

mysql> select trx_state, trx_started, trx_mysql_thread_id, trx_query,trx_id from information_schema.innodb_trx;

trx_state|trx_started          |trx_mysql_thread_id|trx_query             |trx_id         |
---------+---------------------+-------------------+----------------------+---------------+
RUNNING  |2022-02-16 11:35:59.0|            2108141|                      |421609334119616|
RUNNING  |2022-02-16 11:35:59.0|            2108143|SELECT * from sys_user|421609334126000|

第4步 查询当前的锁

-- 查看正在锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS; 

第5步 查看等待锁的事务

-- 查看等待锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

看事务表INNODB_TRX,里面是否有正在锁定的事务线程,看看ID是否在show processlist里面的sleep线程中,如果是,就证明这个sleep的线程事务一直没有commit或者rollback而是卡住了,我们需要手动kill掉。搜索的结果是在事务表发现了很多任务,这时候最好都kill掉。

第5步 kill事务

-- 杀掉事务 线程id 使用第3步的 trx_mysql_thread_id
kill 2107362;