數據庫死鎖和慢日誌問題致使服務不可用的排查過程

 數據庫執行更新失敗,查看日誌sql

首先是根據報的Exception進行排查:數據庫

org.hibernate.exception.LockAcquisitionException: could not execute statement服務器

很明顯,是數據庫死鎖,致使不能執行個人更新sql。ui

思路一:查找並殺死死鎖的進程

查看進程spa

-- 查詢是否鎖表
show OPEN TABLES where In_use > 0;
-- 查詢當前用戶進程
SHOW PROCESSLIST;
-- 查詢當前的事務 
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
-- 查看當前鎖定的事務
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS; 
-- 查看當前等鎖的事務
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

查找出佔用當前鎖的進程id,kill掉便可。hibernate

kill 1234;

經過上面方式未查詢到死鎖的進程,爲排除其餘進程影響,我將鏈接該數據庫的進程都kill掉,以後重啓服務進行從新鏈接,問題依然存在。日誌

思路二:斷開的管道

數據庫死鎖產生的緣由有:code

  • 系統資源不足
  • 進程運行推動的順序不合適
  • 資源分配不當等

經過上面排查基本排除掉是業務代碼產生死鎖,接下來排查系統資源,經過排查,發現果真是系統資源的緣由致使。慢日誌佔用空間過大,致使數據庫所在服務器不能再進行寫入,因此報IOException。排查問題時也應該先從IO異常開始的。blog

接下來就是分析慢日誌,肯定是業務代碼緣由仍是慢日誌配置的緣由(執行時間設定等),分析完以後刪掉騰出空間。進程

相關文章
相關標籤/搜索