我试图调试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