mysql所排查思路
阿新 • • 發佈:2020-07-10
檢視是否有鎖現象
## 1. 看有沒有鎖等待 SHOW STATUS LIKE 'innodb_row_lock%'; ## 2. 檢視哪個事務在等待(被阻塞了) USE information_schema SELECT * FROM information_schema.INNODB_TRX WHERE trx_state='LOCK WAIT'; trx_id : 事務ID號 trx_state : 當前事務的狀態 trx_mysql_thread_id:連線層的,連線執行緒ID(SHOW PROCESSLIST ===>Id或trx_id ) trx_query : 當前被阻塞的操作(一般是要丟給開發的)
檢視鎖源,誰鎖的我!
SELECT * FROM sys.innodb_lock_waits; ## ====>被鎖的和鎖定它的之間關係
locked_table : 哪張表出現的等待
waiting_trx_id: 等待的事務(與上個檢視trx_id 對應)
waiting_pid : 等待的執行緒號(與上個檢視trx_mysql_thread_id)
blocking_trx_id : 鎖源的事務ID
blocking_pid : 鎖源的執行緒號
找到鎖源的thread_id
SELECT * FROM performance_schema.threads WHERE processlist_id=15; ====> 41
找到鎖源的SQL語句
-- 當前在執行的語句 SELECT * FROM performance_schema.`events_statements_current` WHERE thread_id=41; -- 執行語句的歷史 SELECT * FROM performance_schema.`events_statements_history` WHERE thread_id=41; 得出結果,丟給開發 表資訊 被阻塞的 鎖源SQL 練習: 一鍵獲得以上資訊,請寫出具體的SQL語句
優化專案:鎖的監控及處理
1. 背景: 硬體環境: DELL R720,E系列16核,48G MEM,SAS*900G*6,RAID10 在例行巡檢時,發現9-11點時間段的CPU壓力非常高(80-90%) 2. 專案的職責 2.1 通過top詳細排查,發現mysqld程序佔比達到了700-800% 2.2 其中有量的CPU是被用作的SYS和WAIT,us處於正常 2.3 懷疑是MySQL 鎖 或者SQL語句出了問題 2.4 經過排查slowlog及鎖等待情況,發現有大量鎖等待及少量慢語句 (1) pt-query-diagest 檢視慢日誌 (2) 鎖等待有沒有? db03 [(none)]>show status like 'innodb_row_lock%'; +-------------------------------+-------+ | Variable_name | Value | +-------------------------------+-------+ | Innodb_row_lock_current_waits | 0 | | Innodb_row_lock_time | 0 | | Innodb_row_lock_time_avg | 0 | | Innodb_row_lock_time_max | 0 | | Innodb_row_lock_waits | 0 | +-------------------------------+-------+ 情況一: 有100多個current_waits,說明當前很多鎖等待情況 情況二: 1000多個lock_waits,說明歷史上發生過的鎖等待很多 2.5 檢視那個事務在等待(被阻塞了) 2.6 檢視鎖源事務資訊(誰鎖的我) 2.7 找到鎖源的thread_id 2.8 找到鎖源的SQL語句 3. 找到語句之後,和應用開發人員進行協商 (1) 開發人員描述,此語句是事務掛起導致 我們提出建議是臨時kill 會話,最終解決問題 (2) 開發人員檢視後,發現是業務邏輯問題導致的死鎖,產生了大量鎖等待 臨時解決方案,將阻塞事務的會話kill掉. 最終解決方案,修改程式碼中的業務邏輯 專案結果: 經過排查處理,鎖等待的個數減少80%.解決了CPU持續峰值的問題. 鎖監控設計到的命令: show status like 'innodb_rows_lock%' select * from information_schema.innodb_trx; select * from sys.innodb_lock_waits; select * from performance_schema.threads; select * from performance_schema.events_statements_current; select * from performance_schema.events_statements_history;
死鎖監控
show engine innodb status\G show variables like '%deadlock%'; vim /etc/my.cnf innodb_print_all_deadlocks = 1