首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

高效能 MySQL 實戰:用 mysqladmin debug 精準定位鎖持有者

     編輯:MySQL 資料庫相關知識

場景

高併發下出現大量 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 ...    |
+----+------+-----------+------+---------+------+-------+-------------------+

關鍵指令:mysqladmin debug


# 需具備 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:等待高優先級寫鎖。

完整排查流程

  1. SHOW PROCESSLIST 觀察大量 Locked。
  2. 執行 mysqladmin debug。
  3. 查看 log_error 尾部鎖資訊。
  4. 對應 Id 找到阻塞 SQL。
  5. 決定:KILL id、優化 SQL、加索引、調整隔離等級、拆分熱點表。

進階:InnoDB 行鎖監控


-- 即時查看鎖等待
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。養成「觀察 → 定位 → 優化」閉環,避免盲目重啟。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved