使用Ruby on Rails"MySQL服务器已经消失"

Gwy*_*fey 38 mysql ruby-on-rails

在我们的Ruby on Rails应用程序运行了一段时间后,它开始抛出500秒,"MySQL服务器已经消失".这通常是一夜之间发生 它最近开始这样做,我们的服务器配置没有明显的变化.

 Mysql::Error: MySQL server has gone away: SELECT * FROM `widgets`
Run Code Online (Sandbox Code Playgroud)

重新启动mongrels(不是MySQL服务器)修复它.

我们该如何解决这个问题?

mix*_*nic 61

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

production:
  # Your settings
  reconnect: true
Run Code Online (Sandbox Code Playgroud)

看到:

祝好运!


Lau*_*ung 22

这可能是由于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
Run Code Online (Sandbox Code Playgroud)

该方法verify_active_connections!执行多个操作,其中一个操作是重新创建任何过期的连接.

导致此错误的最可能原因是,这是因为猴子补丁重新定义了调度程序不能调用verify_active_connections!,或者verify_active_connections!已更改等.

  • 是啊; 当我遇到这个时,我通过捕获`ActiveRecord :: StatementInvalid`一次并手动调用`ActiveRecord :: Base.verify_active_connections!`来解决问题. (2认同)

Mat*_*lly 5

ActiveRecord::Base.connection.verify!在Ruby on Rails 4中试用。验证ping服务器并在未连接时重新连接。


Isa*_*esh 5

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

set global max_allowed_packet = 1048576; # 2^20 bytes (1 MB) was enough in my case
Run Code Online (Sandbox Code Playgroud)