MySQL性能優化-資料庫死鎖監控
by:授客 QQ:1033553122
1)表鎖定
通過檢查 table_locks_waited 和 table_locks_immediate 狀态變量來分析表鎖定。
SHOW STATUS LIKE 'table%';

說明:
Table_locks_immediate:能夠立即獲得表級鎖的鎖請求次數
Table_locks_waited:不能立即擷取表級鎖而需要等待的鎖請求次數
分析:
如果table_locks_waited值較高,且存在性能問題,則說明存在着較嚴重的表級鎖争用情況。這時,需要對應用做進一步的檢查,來确定問題所在,應首先優化查詢,然後拆分表或複制表。
2)行級鎖
通過檢查 Innodb_row_lock狀态變量來分析行鎖的争用情況
SHOW STATUS LIKE 'Innodb_row_lock%';
Innodb_row_lock_current_waits:目前鎖等待的數量
Innodb_row_lock_time:自系統啟動到現在,鎖定的總時間,機關:毫秒 ms。
Innodb_row_lock_time_avg:平均鎖定的時間,機關:毫秒 ms。
Innodb_row_lock_time_max:最大鎖定時間,機關:毫秒 ms。
Innodb_row_lock_waits:自系統啟動到現在,鎖等待次數,即鎖定的總次數。
針對如果InnoDB_row_lock_waits和InnoDB_row_lock_time_avg的值比較高,說明可能存在鎖争用的情況,針對 Innodb 類型的表,可以通過設定InnoDB Monitors來進一步觀察發生鎖争用的表、資料行等,并分析鎖争用的原因,如下:
注:可通過語句SHOW CREATE TABLE table_name;檢視表table_name使用的引擎(查詢輸出結果中找到ENGINE=xxxx,這裡xxxx即為使用的引擎);
1、先設定InnoDB Monitor
CREATE TABLE innodb_monitor(a INT) ENGINE=INNODB;
2.檢視
SHOW ENGINE INNODB STATUS;
1.輸出結果包含了詳細的目前鎖等待的資訊,包括表名、鎖類型、鎖定記錄的情況等等。打開螢幕以後,預設情況下每 15 秒會向日志中記錄監控的内容,如果長時間打開會導緻.err 檔案變得非常的巨大,是以我們在确認問題原因之後,要記得删除監控表(DROP TABLE innodb_monitor;)以關閉螢幕。
2.輸出結果為基于一段時間的資料采樣,得出的每秒平均值,這裡的時間取自系統啟動到目前時間的時間間隔或者上次輸出到目前時間的時間間隔
3.找到TRANSACTIONS部分的内容,可以檢視事務死鎖争用的相關情況
作者:授客
QQ:1033553122
全國軟體測試QQ交流群:7156436
Git位址:https://gitee.com/ishouke
友情提示:限于時間倉促,文中可能存在錯誤,歡迎指正、評論!
作者五行缺錢,如果覺得文章對您有幫助,請掃描下邊的二維碼打賞作者,金額随意,您的支援将是我繼續創作的源動力,打賞後如有任何疑問,請聯系我!!!
微信打賞
支付寶打賞 全國軟體測試交流QQ群