我正在运行 Ubuntu Intrepid 的 VPS 上管理一个运行 Passenger 和 MySQL 的 rails 应用,今天早上,Web 服务器无法连接到服务器。我的异常通知程序向我发送了一条包含以下错误的消息:
ActionView::TemplateError: Mysql::Error: MySQL server has gone away: SELECT * FROM `table_name` WHERE (`table_name`.`id` = 70)
进入 vps 尝试打开 mysql 得到了以下信息:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
我通过停止 apache、重新启动数据库服务器和重新启动 Passenger 来清除这个错误,这似乎使一切再次正常运转,但这并不能解决为什么会发生这种情况的问题。
我应该在哪些地方寻找此错误的原因?(除了 production.log 或 /var/log ),这样我就可以在将来避免这种情况,并且看到这个问题很容易修复,如果将来再次出现这些情况,是否值得自动重新启动这两台服务器?
答案1
当 MySQL 数据库关闭 Rails 应用打开的持久连接时,就会发生此问题。当您的 Rails 应用长时间处于空闲状态(>= mysql 配置中定义的连接关闭时间)且没有请求到达时,就会发生这种情况。
您可能想要在 mysql 设置中增加连接过期时间 - 或者编写一个 cron 作业来不断从 rails 应用程序获取一些动态页面(以便 rails 保持 db 句柄新鲜)。