高併發下出現大量 Locked 狀態進程,SHOW PROCESSLIST 只能看到等待者,無法直接識別阻塞源頭 SQL。
-- 終端 1:長時間查詢持有讀鎖
USE test;
SELECT SLEEP(12345) FROM foo;
-- 終端 2:嘗試寫入被阻塞
UPDATE foo SET str='bar';
-- 觀察
SHOW PROCESSLIST;
+----+------+-----------+------+---------+------+-------+-------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+------+---------+------+-------+-------------------+
| 10 | root | localhost | test | Query | 100 | Sleep | SELECT SLEEP(...) |
| 20 | root | localhost | test | Query | 5 | Locked| UPDATE foo ... |
+----+------+-----------+------+---------+------+-------+-------------------+
# 需具備 SUPER 權限,若未設 .my.cnf 需加 -u -p
mysqladmin debug
無輸出,資訊寫入錯誤日誌。
# 找日誌路徑
SHOW VARIABLES LIKE 'log_error';
# 例:/var/log/mysqld.log
# 看尾部
tail -n 50 /var/log/mysqld.log
10 test.foo Locked - read Low priority read lock
20 test.foo Waiting - write High priority write lock
10:持有鎖的執行緒 ID(對應 SHOW PROCESSLIST 的 Id)。Locked - read:持有讀鎖(MyISAM 表鎖)。20:等待寫鎖的執行緒 ID。Waiting - write:等待高優先級寫鎖。SHOW PROCESSLIST 觀察大量 Locked。mysqladmin debug。log_error 尾部鎖資訊。Id 找到阻塞 SQL。KILL id、優化 SQL、加索引、調整隔離等級、拆分熱點表。
-- 即時查看鎖等待
SELECT * FROM information_schema.INNODB_LOCK_WAITS\G
SELECT * FROM information_schema.INNODB_LOCKS\G
SELECT * FROM information_schema.INNODB_TRX\G
-- 5.7+ 使用 performance_schema
SELECT * FROM performance_schema.data_locks\G
SELECT * FROM performance_schema.data_lock_waits\G
mysqladmin debug 是 MyISAM 表鎖定位神器;InnoDB 行鎖請用 INFORMATION_SCHEMA 或 performance_schema。養成「觀察 → 定位 → 優化」閉環,避免盲目重啟。