首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

Linux 下排查 MySQL 鎖等待:從 SHOW PROCESSLIST 到 lsof/netstat 定位阻塞進程

     編輯:MySQL 綜合教學

Linux 下排查 MySQL 鎖等待:從 SHOW PROCESSLIST 到 lsof/netstat 定位阻塞進程

業務報數據庫超時,SHOW PROCESSLIST 顯示大量 Locked 狀態。本文演示如何從 MySQL 線程 ID 反查 Linux 進程,定位持鎖 SQL 與來源應用。

1. 現象確認

mysql> SHOW PROCESSLIST;
+----+------+-----------+----+---------+------+-------+------------------+
| Id | User | Host      | db | Command | Time | State | Info             |
+----+------+-----------+----+---------+------+-------+------------------+
| 12 | app  | 192.168.1.152:38292 | db | Query   |  120 | Locked | UPDATE t SET ... |
| 15 | app  | 192.168.1.152:38293 | db | Query   |  115 | Locked | SELECT * FROM t  |
+----+------+-----------+----+---------+------+-------+------------------+

State=Locked 表示等待鎖釋放。Host 列顯示客戶端 IP:Port(此處 38292/38293)。

2. 反查客戶端進程

在客戶端主機 (192.168.1.152) 執行:

方法一:lsof

lsof -Pnl +M -i4 | grep 38292

方法二:netstat

netstat -anp | grep 38292

兩者均可得到對應 PID(示例中為 11882)。

netstat/lsof 輸出

3. 獲取進程詳情

ps aux | grep 11882

輸出示例:

user  11882  0.5  2.1  123456  78900 ?  Sl  10:00  0:15 java -jar app.jar --server.port=8080

可見進程啟動命令、參數、用戶、啟動時間等,便於定位具體應用模塊。

ps 輸出

4. 進一步排查 MySQL 端

  • SHOW ENGINE INNODB STATUS\G 查看鎖信息(TRANSACTIONS 區塊)。
  • SELECT * FROM information_schema.INNODB_TRX; 事務詳情。
  • SELECT * FROM information_schema.INNODB_LOCKS; 鎖詳情(5.7+)。
  • SELECT * FROM information_schema.INNODB_LOCK_WAITS; 等待鏈。
  • KILL 12; 強制終止持鎖事務(謹慎)。

5. 預防建議

  1. 事務儘量短小,避免長事務持鎖。
  2. 索引優化減少掃描行數,降低鎖衝突概率。
  3. 應用層設置查詢超時(socketTimeout、queryTimeout)。
  4. 監控 Locked 線程數,閾值報警。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved