我試圖調試delayed_job進程由於Mysql2::Error: MySQL server has gone away
錯誤而在某些情況下死亡的情況。MySQL服務器在delayed_job任務中消失了錯誤
我的設置有點複雜,但我試圖將它簡化爲基礎。 ClustalwFlowTask
類中的run
方法作爲後臺作業處理。它基本上運行clustalw2
命令(一個程序,它爲DNA和蛋白質的多序列比對)
該命令,並出現在其執行應該在flow_tasks表被記錄,而不是由delayed_job的掛住的錯誤的詳細信息(參見聲明update_attribute
)。
require 'open3'
class ClustalwFlowTask < FlowTask
def run
# setup code ------
# fasta is a file object
cmd = "clustalw2 -INFILE=#{fasta.path}"
Rails.logger.info "[INFO #{Time.now}] #{self} running #{cmd}"
#update_attribute(:command, cmd)
raw_stdin, raw_stdout, raw_stderr = Open3.popen3(cmd)
Rails.logger.info "*********** RAW STDERR: #{raw_stderr} ************"
stdin, stdout, stderr = [raw_stdin, raw_stdout, raw_stderr].map do |io|
s = io.read.strip rescue nil
io.close
s
end
Rails.logger.info "*************** #{stderr} *******************"
unless stderr.blank?
Rails.logger.info "============ THERE IS AN ERROR ============"
#update_attribute(:error, stderr)
return false
end
# more code here -----
end
怪異的行爲開始時用戶沒有安裝clustalw2
二進制,即如果該方法標準錯誤變量不是空白。請注意,在調試過程中,我沒有註釋來自#run
方法的所有update_attribute
語句,因此沒有明顯的MySQL參與。 (我的一個第一預感是標準錯誤消息是太大或包含的東西,使MySQL服務器關閉,但似乎並沒有這樣的情況)
的delayed_job的日誌包含以下內容:
2012-03-26T09:19:25-0700: [Worker(delayed_job host:JadeDragon.local pid:8998)] ClustalwFlowTask failed with ActiveRecord::StatementInvalid: Mysql2::Error: closed MySQL connection: DELETE FROM `delayed_jobs` WHERE `delayed_jobs`.`id` = 107 - 0 failed attempts
這裏似乎正在發生的是delayed_job試圖從數據庫中刪除一個成功的任務,但無法這樣做,因爲mysql連接已被切斷。這發生在ClustalwFlowTask#run
代碼中的return false
語句之後,因爲根據delayed_job,此任務已成功完成。
開發日誌中有這樣的:
================ THERE IS AN ERROR ================
(0.5ms) BEGIN
Mysql2::Error: MySQL server has gone away: BEGIN
SQL (0.2ms) DELETE FROM `delayed_jobs` WHERE `delayed_jobs`.`id` = 110
Mysql2::Error: closed MySQL connection: DELETE FROM `delayed_jobs` WHERE `delayed_jobs`.`id` = 110
(0.1ms) ROLLBACK
Mysql2::Error: closed MySQL connection: ROLLBACK
(0.1ms) BEGIN
Mysql2::Error: closed MySQL connection: BEGIN
(0.1ms) ROLLBACK
Mysql2::Error: closed MySQL connection: ROLLBACK
closed MySQL connection
我跑出來的關於如何調試這個想法,所以任何幫助,將不勝感激。
是MySQL的還是這些事件後運行?問題是可重現的還是零星的?你檢查過服務器上的mysql日誌嗎?服務器上有足夠的內存嗎?也檢查答案和鏈接在這個相關的SO問題:http://stackoverflow.com/questions/6807012/mysql2-error-mysql-server-has-gone-away – 2012-03-26 19:17:14
是的,MySQL服務器仍在運行。在我描述的相同情況下,事件總是可重現的。 mysql日誌不顯示任何錯誤。我已經看到了「服務器已經消失」錯誤的可能原因列表,但似乎沒有什麼適用於此。 – 2012-03-27 04:21:31
@AndreaSingh,你找到了解決這個問題的方法嗎?我正面臨着確切的問題。我嘗試重新連接:真的,但也沒有工作。 – 2016-07-06 09:47:48