我最近从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安装的问题。
我还按照建议here增加了mysql max_allowed_packet(我尝试了4096M并使用show variables like 'max_allowed_packet'
验证了设置,但仍未成功。
按照建议here设置use_transactional_fixtures:false
并使用数据库清理程序也无济于事。
我将问题缩小到仅影响模型中使用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条件中的任何一个都可以很好地工作。我需要增加一些内部缓冲区吗?
答案 0 :(得分:2)
我可以从发布的日志中看出这是一个内部错误导致连接关闭而不是连接问题。所以关注服务器本身而不是连接。
更新:这似乎是5.6中的一个错误。尝试降级