【发布时间】:2014-08-05 08:52:18
【问题描述】:
我最近从 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 并使用Database Cleaner 也无济于事。
更新
我将问题缩小到仅影响在模型中使用 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 条件中的任何一个都可以很好地工作。我需要增加某种内部内存缓冲区吗?
【问题讨论】:
-
Ps:我不会在我的测试中更改数据库架构,所以stackoverflow.com/questions/13161394/… 与我无关。
-
你试过增加net_read_timeout吗?
-
@FuzzyTree:我可以在家里试试这个,但我不太相信它会有所帮助。 (1) 结果集非常小(测试只有大约 20 条记录),应该立即返回。 (2) 来自文档:
This timeout applies only to TCP/IP connections, not to connections made through Unix socket files -
@FuzzyTree net_read_timeout 设置为默认值 30 秒。但是,操作会立即失败 - 无需任何等待时间。使用 TCP 连接而不是套接字时同样的问题。
-
是的,@Unihedron 这样做了 - 它只是一个通用页面,并不特定于错误。另外我已经知道导致mysql崩溃的语句,所以那里的信息对我没有帮助
标签: mysql ruby-on-rails-3 macos