Ruby - 发生异常:[Mysql2 :: Error]关闭MySQL连接

时间:2012-08-02 08:44:42

标签: mysql ruby-on-rails-3 resque

我有一个Rails应用程序现在只在内部运行,所以现在没有那么多的访问。并且有两个resque工作器几乎不能从Web获取数据并插入到mysql数据库中,每个插入后都会睡10秒钟。

我们在VPS上运行它。在每5个小时后,我会遇到异常Exception occured: [Mysql2::Error] closed MySQL connection"

导致异常的原因是什么?现在池大小为5.

如果我提高池大小并在reconnect: true中指定database.yml,会有帮助吗?

3 个答案:

答案 0 :(得分:11)

将mysql2 gem版本0.2.11或更低版本与多线程结合使用时,这是一个常见问题。 a bug on the issue tracker有关于问题的详细信息,但总的来说建议是:

  1. 将您正在使用的宝石版本更新为>= 0.2.12
  2. reconnect: true文件
  3. 中添加数据库连接配置的database.yml选项

    您可能已经解决了问题,但这可能有助于遇到此问题的其他人。

答案 1 :(得分:1)

如果您的员工长时间处于非活动状态,他们将失去MySQL连接。

请参阅here了解解决方案

或者只是将其粘贴在初始化程序中

unless Rails.env.to_s == 'test'
  module ActiveRecord::ConnectionAdapters
    class Mysql2Adapter
      alias_method :execute_without_retry, :execute

    def execute(*args)
      execute_without_retry(*args)
      rescue Exception => e
        if e.message =~ /server has gone away/i
          warn "Server timed out, retrying"
          reconnect!
          retry
        else
          raise e
        end
      end
    end
  end
end 

答案 2 :(得分:0)

更深入了解如何针对 delayed_job 调试此内容。在reconnect: true上设置database.yml后,我执行了以下操作,此解决方案无效。

cd /your_rails_deploy_code/log
cat production.log

# check the pids from delayed job:
E, [2017-02-01T19:45:21.614579 #2592] ERROR -- : 2017-02-01T19:45:21+0000: [Worker(delayed_job.3 host:demeter pid:2592)] Job ActiveJob::QueueAdapters::DelayedJobAdapter::JobWrapper (id=193675) FAILED (0 prior attempts) with Mysql2::Error: closed MySQL connection

就我的具体情况而言,pid:2592是唯一一个经常失败的人。为什么?我们来看看:

[deploy@demeter] ps -ef | grep 2592
deploy   2592     1  0 Jan31 ?        00:00:40 production/delayed_job.3
deploy   23312     1  0 Feb01 ?        00:00:40 production/delayed_job.1
deploy   23318     1  0 Feb01 ?        00:00:40 production/delayed_job.0

我注意到在我最近部署之前几天开始的具体流程。一旦我杀了它,错误就消失了。我假设发生在我的具体案例中的是我的最新部署没有正确删除所有delayed_job实例。