【问题标题】:MySQL server has gone away error in delayed_job taskMySQL服务器在delayed_job任务中消失了错误
【发布时间】:2012-04-10 06:40:10
【问题描述】:

我正在尝试调试由于Mysql2::Error: MySQL server has gone away 错误而导致delayed_job 进程在某些情况下死亡的场景。

我的设置有点复杂,但我尝试将其简化为基础。 ClustalwFlowTask 类中的run 方法作为后台作业处理。它基本上运行一个clustalw2 命令(一个对DNA和蛋白质进行多序列比对的程序)

命令的详细信息和执行过程中发生的任何错误都应记录在 flow_tasks 表中,并且不会被延迟作业捕获(请参阅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 二进制文件时,奇怪的行为开始了,也就是说,如果方法中的 stderr 变量不为空。请注意,我在调试期间取消了 #run 方法中的所有 update_attribute 语句的注释,因此没有明显的 MySQL 参与。 (我的第一个预感是 stderr 消息太大或包含导致 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 问题的答案和链接:stackoverflow.com/questions/6807012/…
  • 是的,mysql服务器还在运行。在我描述的相同情况下,该事件始终是可重现的。 mysql 日志没有显示任何错误。我已经看到了“服务器已消失”错误的可能原因列表,但这里似乎没有任何内容。
  • @AndreaSingh,您找到解决此问题的方法了吗?我正面临着确切的问题。我试过 reconnect: true 但这也没有用。

标签: ruby-on-rails-3 delayed-job


【解决方案1】:

尝试将reconnect: true 添加到您的database.yml

【讨论】:

  • 看这个有一段时间了。这解决了我。 Rails 3.2.7
猜你喜欢
  • 2010-12-31
  • 2010-09-14
  • 2012-08-13
  • 2012-02-25
  • 1970-01-01
  • 2015-12-18
  • 2012-06-28
  • 2011-12-18
相关资源
最近更新 更多