connection was bad 真實案例
####################################
一、背景:
業務反映他們程式端日誌最近老有“connection was bad”報錯,
服務端程式語言為:golang
資料庫驅動程式:golang自帶的驅動
資料庫架構:lvs+kingshard+mysql的一主多從叢集
具體報錯日誌如下圖也:
業務方程式訪問資料庫:
二、原因:
由於業務方之前有大量的慢查詢,當時為了不讓資料庫奔潰,跟業務商量後,決定暫時殺掉這些慢查詢,以免影響其他查詢,所以,當時就給這個mysql叢集的每個例項都配置了一個殺掉慢查詢定時任務,該任務如下:
/usr/local/bin/pt-kill --host=xxx --user=root --password=root --match-info=select|SELECT --victims=all --interval 30 --busy-time 300 --kill --print --daemon
由於該任務中配置了-match-info=select|SELECT 和--busy-time 300,表示查詢時間超過了300s的sql就會被pt-kill工具給殺掉,因此業務方的sql由於有慢查詢,且時間超過了300s,所以就會給業務方直接殺掉了,因此報該錯誤,由於時間好幾個月了,自己也忘記了配置的這個任務,因此定位時間花了我一個周,開始以為是業務方沒有按照lvs的連線超時機制來配置,然後讓業務方按照要求配置,結果業務方按照要求配置了後,還是有這樣的報錯,於是業務方拿出了sql語句,開始懷疑是慢查詢,我這邊在kingshard日誌中也獲取到了這個sql的報錯,於是手動直連一個數據庫從庫進行查詢,結果在300s的時候就出現了:ERROR 2013 (HY000): Lost connection to MySQL server during query
於是,開始懷疑到了pt-kill定時任務,結果一檢視,果然有這個pt-kill任務在跑。
三、解決:
和業務商量後,決定這個定時任務暫時還是不取消,業務自己改進下sql。
##################################