Rails - 在文本列中插入超过7786个字符时,获取'Mysql服务器已消失'

时间:2013-03-17 12:56:17

标签: mysql ruby-on-rails

我有一个'blog_articles'类,其中包含一个名为'content'的文本列。这是迁移:

create_table :blog_articles do |t|
  t.references :blog_user
  t.string :title
  t.text :summary
  t.text :content

  t.boolean :published, :default => false
  t.timestamps
end

我还有一个自定义佣金任务rake db:rebuild,执行dropcreatemigrate然后seed。这是rake任务:

namespace :db do
  desc "run db:drop, db:create, db:migrate and db:seed tasks in a row."
  task :rebuild => :environment do
    if Rails.env == "production"
      # Do nothing
    else
      Rake::Task["db:drop"].invoke
      Rake::Task["db:create"].invoke
      Rake::Task["db:migrate"].invoke
      Rake::Task["db:seed"].invoke
    end
  end
end

-

所以我的问题是,当我尝试插入一篇文章(在seeds.rb文件中),内容超过7768个字符时,我收到Mysql2::Error: MySQL server has gone away : INSERT INTO 'blog_articles' [...]错误,使用rake db:rebuild任务。

如果我手动运行rake db:seed,或者我在控制器中创建文章,则完全没问题。

我该如何解决这个问题?我使用了很多新的db:rebuild任务。


编辑:

所以,我通过将重建任务更改为此

来解决我的问题
namespace :db do
  desc "run db:drop, db:create, db:migrate and db:seed tasks in a row."
  task :rebuild => :environment do
    if Rails.env == "production"
      # Do nothing
    else      
      system "rake db:drop"
      system "rake db:create"
      system "rake db:migrate"
      system "rake db:seed"
    end
  end
end

我不明白它有什么不同,但这有效。 有人有解释吗?

1 个答案:

答案 0 :(得分:1)

尝试修改my.cnf,增加max_allowed_packet

[mysqld]
max_allowed_packet=512M

http://dev.mysql.com/doc/refman/5.1/en/packet-too-large.html

  

当MySQL客户端或mysqld服务器收到大于max_allowed_pa​​cket字节的数据包时,会发出ER_NET_PACKET_TOO_LARGE错误并关闭连接。对于某些客户端,如果通信包太大,您在查询错误期间也可能会失去与MySQL服务器的连接。