1. 程式人生 > 實用技巧 >connection was bad 真實案例

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。

##################################