1.查看表被鎖狀態(tài)
為惠安等地區(qū)用戶(hù)提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及惠安網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、惠安網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專(zhuān)業(yè)、用心的態(tài)度為用戶(hù)提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶(hù)的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
2.查看造成死鎖的sql語(yǔ)句
3.查詢(xún)進(jìn)程
4.解鎖(刪除進(jìn)程)
5.查看正在鎖的事物? (8.0以下版本)
6.查看等待鎖的事物?(8.0以下版本)
第一步,查出已鎖的進(jìn)程
查看正在鎖的事務(wù)
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
``
查看等待鎖的事務(wù)
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
``
INNODB_TRX表主要是包含了正在InnoDB引擎中執(zhí)行的所有事務(wù)的信息,包括waiting for a lock和running的事務(wù)
select * from information_schema.innodb_trx
``
第二步,kill進(jìn)程
show engin innodb status; //最后一次死鎖信息及sql
show open tables where in_use 0 //查看鎖表
以下五種方法可以快速定位全局鎖的位置,僅供參考。
方法1:利用 metadata_locks 視圖
此方法僅適用于 MySQL 5.7 以上版本,該版本 performance_schema 新增了 metadata_locks,如果上鎖前啟用了元數(shù)據(jù)鎖的探針(默認(rèn)是未啟用的),可以比較容易的定位全局鎖會(huì)話(huà)。
方法2:利用 events_statements_history 視圖此方法適用于 MySQL 5.6 以上版本,啟用 performance_schema.eventsstatements_history(5.6 默認(rèn)未啟用,5.7 默認(rèn)啟用),該表會(huì) SQL 歷史記錄執(zhí)行,如果請(qǐng)求太多,會(huì)自動(dòng)清理早期的信息,有可能將上鎖會(huì)話(huà)的信息清理掉。
方法3:利用 gdb 工具如果上述兩種都用不了或者沒(méi)來(lái)得及啟用,可以嘗試第三種方法。利用 gdb 找到所有線程信息,查看每個(gè)線程中持有全局鎖對(duì)象,輸出對(duì)應(yīng)的會(huì)話(huà) ID,為了便于快速定位,我寫(xiě)成了腳本形式。也可以使用 gdb 交互模式,但 attach mysql 進(jìn)程后 mysql 會(huì)完全 hang 住,讀請(qǐng)求也會(huì)受到影響,不建議使用交互模式。
方法4:show processlist
如果備份程序使用的特定用戶(hù)執(zhí)行備份,如果是 root 用戶(hù)備份,那 time 值越大的是持鎖會(huì)話(huà)的概率越大,如果業(yè)務(wù)也用 root 訪問(wèn),重點(diǎn)是 state 和 info 為空的,這里有個(gè)小技巧可以快速篩選,篩選后嘗試 kill 對(duì)應(yīng) ID,再觀察是否還有 wait global read lock 狀態(tài)的會(huì)話(huà)。
方法5:重啟試試!
1、確定mysql有鎖表的情況則使用以下命令查看鎖表進(jìn)程
2、殺掉查詢(xún)結(jié)果中已經(jīng)鎖表的trx_mysql_thread_id
擴(kuò)展:
1、查看鎖的事務(wù)
2、查看等待鎖的事務(wù)
3、查詢(xún)是否鎖表:
4、查詢(xún)進(jìn)程