1. 程式人生 > 實用技巧 >mysql所排查思路

mysql所排查思路

檢視是否有鎖現象

## 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  

資料庫優化參考:https://www.jianshu.com/p/5dbb5e095c9a