&引用;MySQL服务器已经消失了”;使用Ruby on Rails

&引用;MySQL服务器已经消失了”;使用Ruby on Rails,mysql,ruby-on-rails,Mysql,Ruby On Rails,在我们的RubyonRails应用程序运行了一段时间后,它开始抛出500个“MySQL服务器消失了”。这种情况常常在一夜之间发生。它最近开始这样做,服务器配置没有明显变化 Mysql::Error: MySQL server has gone away: SELECT * FROM `widgets` 重新启动mongrels(而不是MySQL服务器)可以修复它 我们如何解决这个问题?到MySQL服务器的连接可能超时了 您应该能够增加MySQL中的超时时间,但是为了获得正确的修复,请让代码检

在我们的RubyonRails应用程序运行了一段时间后,它开始抛出500个“MySQL服务器消失了”。这种情况常常在一夜之间发生。它最近开始这样做,服务器配置没有明显变化

 Mysql::Error: MySQL server has gone away: SELECT * FROM `widgets`
重新启动mongrels(而不是MySQL服务器)可以修复它


我们如何解决这个问题?

到MySQL服务器的连接可能超时了


您应该能够增加MySQL中的超时时间,但是为了获得正确的修复,请让代码检查数据库连接是否仍然处于活动状态,如果没有,请重新连接。

您是否监视打开的MySQL连接或线程数?最大连接的mysql.ini设置是什么

mysql> show status;
查看连接、使用的最大连接、连接的线程和创建的线程

您可能需要增加MySQL配置中的限制,或者rails没有正确关闭连接*

注意:我只是简单地使用了RubyonRails


服务器状态的MySQL文档在中。

这可能是由于MySQL的持久连接消失(如果发生在夜间,则可能会超时)以及Ruby on Rails无法恢复连接造成的,默认情况下应该这样做:

文件vendor/rails/actionpack/lib/action\u controller/dispatcher.rb中的代码是:

if defined?(ActiveRecord)
  before_dispatch { ActiveRecord::Base.verify_active_connections! }
  to_prepare(:activerecord_instantiate_observers) {ActiveRecord::Base.instantiate_observers }
end
方法
验证\u活动\u连接执行多个操作,其中一个操作是重新创建任何过期的连接


此错误最可能的原因是,这是因为a重新定义了dispatcher,使其不调用
verify\u active\u连接,或
验证\u活动\u连接已更改,等等。

正如该线程的其他贡献者所说,MySQL服务器很可能由于不活动而关闭了与Ruby on Rails应用程序的连接。默认超时为28800秒,即8小时

set-variable = wait_timeout=86400
将此行添加到您的
/etc/my.cnf
会将超时时间提高到24小时

尽管文档没有指出,值0可能会完全禁用超时,但您需要进行实验,因为这只是猜测

然而,据我所知,还有三种情况会产生这种错误。第一个是正在重新启动的MySQL服务器。这显然会删除所有连接,但由于MySQL客户端是被动的,在执行下一个查询之前不会注意到这一点

第二个条件是,如果有人从MySQL命令行终止您的查询,这也会断开连接,因为这可能会使客户端处于未定义状态


最后一个问题是MySQL服务器由于致命的内部错误而重新启动。也就是说,如果您对一个表进行简单查询,并立即看到“MySQL已经消失”,我会仔细查看您的服务器日志,以检查硬件错误或数据库损坏。

Ruby on Rails 2.3为您的数据库连接提供了一个重新连接选项:

production:
  # Your settings
  reconnect: true
见:


祝你好运

在database.yml中使用reconnect:true将导致在引发ActiveRecord::StatementInvalid错误后重新建立数据库连接(如Dave Cheney所述)

不幸的是,为防止连接超时,在数据库操作上添加重试似乎是必要的:

begin
  do_some_active_record_operation
rescue ActiveRecord::StatementInvalid => e
  Rails.logger.debug("Got statement invalid #{e.message} ... trying again")
  # Second attempt, now that db connection is re-established
  do_some_active_record_operation
end

我在使用
mysql2
gem的RubyonRails3应用程序中遇到了这个问题。我复制了有问题的查询,并尝试直接在MySQL中运行它,但我得到了相同的错误,“MySQL服务器已经消失了。”

这个问题非常非常大。非常大的插入(+1MB)。我试图插入的字段是一个文本列,其最大大小为64KB。连接没有抛出错误,而是消失了


我增加了字段的大小,得到了相同的结果,所以我仍然不确定确切的问题是什么。关键是,由于一些奇怪的查询,它在数据库中。无论如何

首先,确定MySQL中的最大连接数:

show variables like "max_connections";
show status where variable_name = 'Threads_connected';
您需要确保在RubyonRails应用程序中建立的连接数小于允许的最大连接数。请注意,额外的连接可能来自您的作业、延迟的作业进程(每个进程在
数据库.yml中的池大小相同)等

通过在MySQL中执行以下操作,在运行应用程序、运行进程等时监视SQL连接:

show variables like "max_connections";
show status where variable_name = 'Threads_connected';
<> >您可能想考虑在<代码>线程< /代码>完成连接后,数据库连接不会自动关闭(我认为这不是Ruby on Rails 4应用程序的问题):


尝试
ActiveRecord::Base.connection.verify在RubyonRails4中。验证ping服务器,并在未连接时重新连接。

还要检查Unicorn配置是否正确。请参阅这里的ActiveRecord连接的fork处理前后:

我在向MySQL发送非常大的语句时遇到了这个问题。MySQL限制语句的大小,如果超过限制,将关闭连接

set global max_allowed_packet = 1048576; # 2^20 bytes (1 MB) was enough in my case
在铁轨上分叉时。 对于在Rails中分叉时遇到此问题的任何人,请尝试在分叉之前清除现有连接,然后为每个分叉建立新连接,如下所示:

#在分叉之前清除现有连接,以确保它们不会被继承。
::ActiveRecord::Base.clear_所有连接!
叉子
#为每个分叉建立新连接。
::ActiveRecord::Base.build\u连接
#每个fork的其余代码。。。
结束

请参见此处的StackOverflow回答:

在我使用过的rails应用程序中,我在当前请求期间没有看到活动记录重新连接,但在下一个请求时它会重新连接,因此,如果您可以每周一复制一个异常,则这可能是一种临时情况