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


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

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

org.hibernate.exception.LockAcquisitionException: could not execute statement

很明顯,是數據庫死鎖,導致不能執行我的更新sql。

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

查看進程

-- 查詢是否鎖表
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掉即可。

kill 1234;

通過上面方式未查詢到死鎖的進程,為排除其他進程影響,我將連接該數據庫的進程都kill掉,之后重啟服務進行重新連接,問題依然存在。

思路二:斷開的管道

數據庫死鎖產生的原因有:

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

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

接下來就是分析慢日志,確定是業務代碼原因還是慢日志配置的原因(執行時間設定等),分析完之后刪掉騰出空間。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM