第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;