Ruby on Rails使" MySQL服务器消失了"
在我们的Ruby on Rails应用程序运行了一段时间之后,由于" MySQL服务器已消失",它开始抛出500秒钟。通常这会在一夜之间发生。它是从最近开始执行此操作的,我们的服务器配置没有明显变化。
Mysql::Error: MySQL server has gone away: SELECT * FROM `widgets`
重新启动mongrels(不是MySQL服务器)可以修复它。
我们该如何解决呢?
解决方案
与MySQL服务器的连接可能正在超时。
我们应该能够增加MySQL的超时时间,但是要进行适当的修复,请让代码检查数据库连接是否仍然有效,如果没有,请重新连接。
我们是否监视打开的MySQL连接或者线程的数量? max_connections的mysql.ini设置是什么?
mysql> show status;
查看"连接数"," Max_used_connections"," Threads_connected"和" Threads_created"。
我们可能需要增加MySQL配置中的限制,或者Rails不能正确关闭连接*。
注意:我只是简要地使用了Ruby on Rails ...
有关服务器状态的MySQL文档在http://dev.mysql.com/doc/refman/5.0/en/server-status-variables.html中。
这可能是由于与MySQL的持久连接消失了(如果发生在夜间,则可能会超时),并且Ruby on Rails无法恢复连接,默认情况下应该这样做:
在文件vendor / rails / actionpack / lib / action_controller / dispatcher.rb中是代码:
if defined?(ActiveRecord) before_dispatch { ActiveRecord::Base.verify_active_connections! } to_prepare(:activerecord_instantiate_observers) {ActiveRecord::Base.instantiate_observers } end
" verify_active_connections!"方法执行几个动作,其中之一是重新创建任何过期的连接。
导致此错误的最可能原因是,由于猴子补丁已将调度程序重新定义为不调用" verify_active_connections!"或者" verify_active_connections!"已被更改,等等。
正如该线程的其他贡献者所说,MySQL服务器很可能由于不活动而关闭了与Ruby on Rails应用程序的连接。默认超时为28800秒或者8小时。
set-variable = wait_timeout=86400
将此行添加到/ etc / my.cnf
会将超时增加到24小时
http://dev.mysql.com/doc/refman/5.0/zh-CN/server-system-variables.html#option_mysqld_wait_timeout。
尽管文档中没有对此进行说明,但是0值可能会完全禁用超时,但是我们需要进行试验,因为这只是推测。
但是,据我所知还有其他三种情况可能会产生该错误。首先是MySQL服务器正在重新启动。显然,这将删除所有连接,但是由于MySQL客户端是被动的,因此在我们执行下一个查询之前不会注意到这一点。
第二个条件是,如果有人从MySQL命令行中杀死了查询,这也会删除连接,因为这可能会使客户端处于未定义状态。
最后是MySQL服务器是否由于致命的内部错误而自行重启。也就是说,如果我们正在对表进行简单查询,并立即看到" MySQL已经消失",我将仔细查看服务器的日志以检查硬件错误或者数据库损坏。
Ruby on Rails 2.3具有用于数据库连接的重新连接选项:
production: # Your settings reconnect: true
看:
- Ruby on Rails 2.3发行说明,第4.8节"重新连接MySQL连接"。
- 再次探讨MySQL自动重新连接
祝你好运!