業務報數據庫超時,SHOW PROCESSLIST 顯示大量 Locked 狀態。本文演示如何從 MySQL 線程 ID 反查 Linux 進程,定位持鎖 SQL 與來源應用。
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)。
在客戶端主機 (192.168.1.152) 執行:
lsof -Pnl +M -i4 | grep 38292
netstat -anp | grep 38292
兩者均可得到對應 PID(示例中為 11882)。

ps aux | grep 11882
輸出示例:
user 11882 0.5 2.1 123456 78900 ? Sl 10:00 0:15 java -jar app.jar --server.port=8080
可見進程啟動命令、參數、用戶、啟動時間等,便於定位具體應用模塊。

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; 強制終止持鎖事務(謹慎)。socketTimeout、queryTimeout)。Locked 線程數,閾值報警。