MySQL 鎖表后快速解決方法

2022-08-04 17:37 更新

遇到鎖表快速解決辦法

依次執(zhí)行1-6步,運行第6步生成的語句即可。

如果特別著急,運行 1 2 6 步 以及第6步生成的kill語句 即可。

第1步 查看表是否在使用。

?show open tables where in_use > 0 ;?如果查詢結(jié)果為空。則證明表沒有在使用。結(jié)束。

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

如果查詢結(jié)果不為空,繼續(xù)后續(xù)的步驟。

mysql>  show open tables where in_use > 0 ;
+----------+-------+--------+-------------+
| Database | Table | In_use | Name_locked |
+----------+-------+--------+-------------+
| test     | t     |      1 |           0 |
+----------+-------+--------+-------------+
1 row in set (0.00 sec)

第2步 查看數(shù)據(jù)庫當前的進程,看一下有無正在執(zhí)行的慢SQL記錄線程。

?show processlist;?show processlist 是顯示用戶正在運行的線程,需要注意的是,除了 root 用戶能看到所有正在運行的線程外,其他用戶都只能看到自己正在運行的線程(即與您正在使用的MySQL帳戶關聯(lián)的線程),看不到其它用戶正在運行的線程。如果不使用FULL關鍵字,Info字段中只顯示每條語句的前100個字符。

第3步 當前運行的所有事務

SELECT * FROM information_schema.INNODB_TRX;

第4步 當前出現(xiàn)的鎖

SELECT * FROM information_schema.INNODB_LOCKs;

第5步 鎖等待的對應關系

SELECT * FROM information_schema.INNODB_LOCK_waits;

看事務表INNODB_TRX,里面是否有正在鎖定的事務線程,看看ID是否在show processlist里面的sleep線程中,如果是,就證明這個sleep的線程事務一直沒有commit或者rollback而是卡住了,我們需要手動kill掉。

搜索的結(jié)果是在事務表發(fā)現(xiàn)了很多任務,這時候最好都kill掉。

第6步 批量刪除事務表中的事務

這里用的方法是:通過information_schema.processlist表中的連接信息生成需要處理掉的MySQL連接的語句臨時文件,然后執(zhí)行臨時文件中生成的指令。

SELECT concat('KILL ',id,';')
FROM information_schema.processlist p
INNER JOIN  information_schema.INNODB_TRX x
ON p.id=x.trx_mysql_thread_id
WHERE db='test';

記得修改對應的數(shù)據(jù)庫名。

這個語句執(zhí)行后結(jié)果如下:

mysql>  SELECT concat('KILL ',id,';')  FROM information_schema.processlist p  INNER JOIN  information_schema.INNODB_TRX x  ON p.id=x.trx_mysql_thread_id  WHERE db='test';
+------------------------+
| concat('KILL ',id,';') |
+------------------------+
| KILL 42;               |
| KILL 40;               |
+------------------------+
2 rows in set (0.00 sec)

執(zhí)行結(jié)果里的兩個kill語句即可解決鎖表。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號