【问题标题】:migrating from postgres to mysql causing strange errors Mysql2::Error: MySQL server has gone away从 postgres 迁移到 mysql 导致奇怪的错误 Mysql2::Error: MySQL server has gone away
【发布时间】:2011-06-24 18:38:52
【问题描述】:

我正在切换我开发的 rails 3.0.3 应用程序的数据库 postgres 到 mysql,这样我就可以利用亚马逊的 rds。在我做之前 我在开发人员上使用 mysql 运行测试代码的变化 带有 mysql2 适配器的机器。我的测试代码抛出了一些 我还没有完全弄清楚的错误。 基本上我有一个用于存储大型 xml 上传的模型。我的 测试代码看起来像这样

test "xml upload for large file" do 
  file = File.new("test/files/lib/upload_sample.xml") 
  upload = XmlUpload.create(:xml_contents => contents = file.read) 
  ..... 
  ..... 
end 

创建行抛出以下错误

ActiveRecord::StatementInvalid: Mysql2::Error: SAVEPOINT active_record_1 does not exist:     ROLLBACK TO SAVEPOINT active_record_1 
/Users/conor/.rvm/gems/ruby-1.9.2-p136/gems/activerecord-3.0.3/lib/ active_record/connection_adapters/abstract_adapter.rb:202:in `rescue in log' 
/Users/conor/.rvm/gems/ruby-1.9.2-p136/gems/activerecord-3.0.3/lib/active_record/connection_adapters/abstract_adapter.rb:194:in `log' 
/Users/conor/.rvm/gems/ruby-1.9.2-p136/gems/mysql2-0.2.6/lib/ active_record/connection_adapters/mysql2_adapter.rb:314:in `execute' 
/Users/conor/.rvm/gems/ruby-1.9.2-p136/gems/mysql2-0.2.6/lib/ active_record/connection_adapters/mysql2_adapter.rb:358:in `rollback_to_savepoint' 
/Users/conor/.rvm/gems/ruby-1.9.2-p136/gems/activerecord-3.0.3/lib/ active_record/connection_adapters/abstract/database_statements.rb: 149:in `rescue in transaction' 
/Users/conor/.rvm/gems/ruby-1.9.2-p136/gems/activerecord-3.0.3/lib/  active_record/connection_adapters/abstract/database_statements.rb: 127:in `transaction' 
/Users/conor/.rvm/gems/ruby-1.9.2-p136/gems/activerecord-3.0.3/lib/ active_record/transactions.rb:204:in `transaction' 
/Users/conor/.rvm/gems/ruby-1.9.2-p136/gems/activerecord-3.0.3/lib/ active_record/transactions.rb:287:in `with_transaction_returning_status' 
/Users/conor/.rvm/gems/ruby-1.9.2-p136/gems/activerecord-3.0.3/lib/ active_record/transactions.rb:237:in `block in save' 
/Users/conor/.rvm/gems/ruby-1.9.2-p136/gems/activerecord-3.0.3/lib/ active_record/transactions.rb:248:in `rollback_active_record_state!' 
/Users/conor/.rvm/gems/ruby-1.9.2-p136/gems/activerecord-3.0.3/lib/ active_record/transactions.rb:236:in `save'  
....

我一直将文件内容存储在文本字段中。我意识到 我应该认真考虑将文件存储在 s3 中,但这是 我目前的设置。在 postgres 中一切正常 但为了让事情与 mysql 一起工作,我必须设置 :limit 变量,以便使用 LONGTEXT 而不是标准文本 场地。文件可能很大,但是当我使用小文件进行测试时 没有问题

我可能完全找错了树,但我怀疑 问题可能是由于数据库连接被丢弃引起的 关于我尝试在开发中上传文件时引发的错误 模式。我对此错误进行了一些检查,但我不确定是什么导致了连接断开,插入文件不需要 8 小时(默认连接断开时间)

Mysql2::Error: MySQL server has gone away: INSERT INTO xml_uploads ........

我的 database.yaml 设置如下。

test: 
   adapter: mysql2 
   encoding: utf8 
   reconnect: true 
   database: app_test 
   username: username 
   password: password 
   host: localhost 

有没有人知道问题是什么以及如何解决 固定的?对此的任何帮助将不胜感激。

【问题讨论】:

  • Conor,几年前我曾经在使用 java 时遇到过这个问题,但我记不清是什么问题了。但我记得我们正在使服务器超载(也许事务对于服务器来说太大了)并且它停止响应“服务器已消失”的消息。你用一个小数据集试过这个吗?还是一个小文件?
  • 您好 Augusto,感谢您的回复。我已经尝试使用小文件进行测试,并且一切运行顺利,但是使用代表可以上传的数据类型的测试文件失败了。这些文件很大(1.5-2.5mb),但并不疯狂。我认为连接超时并在插入之前被丢弃,但我不确定为什么会这样
  • 尝试在 mysql 中设置一个非常大的超时 - 详细信息可以在这里找到 - dev.mysql.com/doc/refman/5.0/en/gone-away.html
  • 嗨 ajeal,感谢您的回复。我也看了一下,并尝试使用 timeout 变量。默认值为 28800 秒(8 小时),所以我猜测是其他原因导致了问题,但我不确定是什么。我还在我的 rails 应用程序中使用了默认设置,但我仍然没有任何运气

标签: mysql ruby-on-rails ruby-on-rails-3 migration


【解决方案1】:

我还是决定将数据存储在 S3 中,但一位朋友确实为我指明了解决此问题的方向,我对其进行了测试并且它有效,所以我认为我应该将其发布在这里以防其他人遇到同样的问题。

基本上,问题是由 max_allowed_pa​​cket 变量设置为小于博客/文本字段大小的值引起的。无法执行查询,因此连接被删除。以下是有关 max_allowed_pa​​cket 变量的一些详细信息

http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_max_allowed_packet

还有一些关于在 rds 实例上调整它的信息

http://www.henrybaxter.ca/?p=111

【讨论】:

    猜你喜欢
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 2012-10-30
    • 2017-12-21
    • 1970-01-01
    • 2019-10-13
    • 2013-12-16
    相关资源
    最近更新 更多