第一種:
前提條件:找到執行非常慢的sql;
如何找呢:還原客戶遇到的問題場景,從控制台找到所執行的sql,一句句的去執行,直到找到執行非常慢的sql
1.查詢是否鎖表
show OPEN TABLES where In_use > 0;
2.查詢進程(如果您有SUPER權限,您可以看到所有線程。否則,您只能看到您自己的線程)
show processlist
3.殺死進程id(就是上面命令的id列)
kill id
第二種:
1.查看下在鎖的事務
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
2.殺死進程id(就是上面命令的trx_mysql_thread_id列)
kill 線程ID
第三種:
也許你無法查看到所在的info,這個時候你需要重啟服務器,如果是分布式的話,就一台台重啟吧;
原理是:殺死所有進程,釋放所有鎖。
MySQL - 鎖等待超時與information_schema的三個表:
-- 1.information_schema.innodb_trx–當前運行的所有事務
select * from information_schema.innodb_trx;
-- information_schema.innodb_locks–當前出現的鎖
select * from information_schema.innodb_locks;
-- information_schema.innodb_lock_waits–鎖等待的對應關系
select * from information_schema.innodb_lock_waits;
-------------------------------------------------------------------------------------------
//常用
MySQL - 鎖等待超時與information_schema的三個表:
-- 1.information_schema.innodb_trx–當前運行的所有事務
select * from information_schema.innodb_trx;
-- information_schema.innodb_locks–當前出現的鎖
select * from information_schema.innodb_locks;
-- information_schema.innodb_lock_waits–鎖等待的對應關系
select * from information_schema.innodb_lock_waits;
-------------------------------------------------------------------------------------------
//常用
select * from information_schema.innodb_trx where trx_state = 'LOCK WAIT';
SELECT a.* FROM information_schema.processlist a where command <> 'sleep' ORDER BY time desc
select * from information_schema.processlist where time> 60 and user='srapp_stsj';
SELECT
concat('kill',' ', id,';')
FROM
information_schema. PROCESSLIST a
WHERE
command <> 'sleep'
AND info LIKE 'select%'
AND time > 60
and user = 'srapp_stsj'
ORDER BY
time DESC
EXPLAIN
select * from sr_main where sys_scbj = '0' and mdjlx = 'ls_jz' and sys_spzt = 2
and mhzsfz = '330219193210200010'