我最近从 Ubuntu 切换到了 OSX。现在我无法再运行 RSpec 测试,尽管它可以在 Ubuntu 上运行。
第一个测试用例将始终返回:
Failure/Error: @match.save!
ActiveRecord::StatementInvalid:
Mysql2::Error: MySQL server has gone away: ROLLBACK TO SAVEPOINT active_record_1
然后是此后的每个测试用例:
Failure/Error: Unable to find matching line from backtrace
Mysql2::Error:
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (61)
我的database.yml只是通过套接字/tmp/mysql.sock
连接到数据库。设置reconnect:true
没有什么区别。
我通过自制程序安装了mysql。我也已经按照所述重新安装了它here确保不是mysql安装的问题。
我还按照建议增加了 mysql max_allowed_packet here (我尝试了高达 4096M 并使用 show variables like 'max_allowed_packet'
验证了设置,但仍然没有成功。
按照建议设置use_transactional_fixtures:false
here使用数据库清理器也没有帮助。
更新
我将问题范围缩小到仅影响模型中使用 before_save 触发器的测试用例。在开发模式下触发受影响的方法时,会出现同样的问题:
Mysql2::Error: Lost connection to MySQL server during query: UPDATE ...
同时,我还删除了自制 mysql 服务器并从官方网站安装了服务器 - 但没有任何运气。
这是 mysql 错误日志,两个 mysql 服务器版本(官方+自制)看起来都很相似:Gist
更新二
以下是有问题的陈述。我还可以在 MySQL 控制台中单独运行它,它会可靠地使服务器崩溃:
UPDATE bets SET points = 2 WHERE betsession_id IN (1, 3, 5, 7, 10, 16, 31, 33, 35, 39, 42, 44, 49, 50, 56, 58, 61) AND match_id = 1583 AND (home_score = guest_score) AND (home_score = 2 OR home_score = 0);
我可以将其精简为
UPDATE bets SET points = 2 WHERE (home_score = guest_score);
这有时会使服务器崩溃。然而,添加 AND (home_score = 0 OR home_score = 2)
确实会导致崩溃。孤立的 2 个 WHERE 条件中的任何一个往往都能很好地发挥作用。我是否需要增加某种内部内存缓冲区?
最佳答案
我可以从发布的日志中看出,这是导致连接关闭的内部错误,而不是连接问题。因此,重点关注服务器本身而不是连接。
更新:这似乎是 5.6 中的一个错误。尝试降级
关于mysql - Mac OSX/MySQL 5.6.19 上为 "Mysql2::Error: Lost connection to MySQL server during query",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24228300/