MySQL 鎖表后快速解決方法

2022-08-04 17:37 更新

遇到鎖表快速解決辦法

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

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

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

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

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

如果查詢(xún)結(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ù)庫(kù)當(dāng)前的進(jìn)程,看一下有無(wú)正在執(zhí)行的慢SQL記錄線(xiàn)程。

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

第3步 當(dāng)前運(yùn)行的所有事務(wù)

SELECT * FROM information_schema.INNODB_TRX;

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

SELECT * FROM information_schema.INNODB_LOCKs;

第5步 鎖等待的對(duì)應(yīng)關(guān)系

SELECT * FROM information_schema.INNODB_LOCK_waits;

看事務(wù)表INNODB_TRX,里面是否有正在鎖定的事務(wù)線(xiàn)程,看看ID是否在show processlist里面的sleep線(xiàn)程中,如果是,就證明這個(gè)sleep的線(xiàn)程事務(wù)一直沒(méi)有commit或者rollback而是卡住了,我們需要手動(dòng)kill掉。

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

第6步 批量刪除事務(wù)表中的事務(wù)

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

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

記得修改對(duì)應(yīng)的數(shù)據(jù)庫(kù)名。

這個(gè)語(yǔ)句執(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é)果里的兩個(gè)kill語(yǔ)句即可解決鎖表。


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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)