Ruby on rails 3.2 Mysql2::Error 139:DB:FIXTURES:LOAD for LARGE TEXT FIELDS使插入过程崩溃,并且经常损坏fixture

Ruby on rails 3.2 Mysql2::Error 139:DB:FIXTURES:LOAD for LARGE TEXT FIELDS使插入过程崩溃,并且经常损坏fixture,ruby-on-rails-3.2,Ruby On Rails 3.2,问题 为大文本字段加载夹具会使夹具处理过程崩溃,甚至经常会损坏夹具(.yml)文件。 环境 ruby 1.9.3p194(2012-04-20修订版35410)[x86_64-darwin10.8.0];轨道3.2.6;OSX 10.6.8WebBrick和MySQL―8 Gb RAM 背景 1:我们的项目展示了大量的文章,可以定期阅读 超过5-10000字 2:分配给记录的转义内容(即使是中等容量) 使夹具过程崩溃 3:rake db:fixtures:load将在带有 以下错误/警告:无法确

问题

为大文本字段加载夹具会使夹具处理过程崩溃,甚至经常会损坏夹具(.yml)文件。

环境

ruby 1.9.3p194(2012-04-20修订版35410)[x86_64-darwin10.8.0];轨道3.2.6;OSX 10.6.8WebBrick和MySQL―8 Gb RAM

背景

1:我们的项目展示了大量的文章,可以定期阅读 超过5-10000字

2:分配给记录的转义内容(即使是中等容量) 使夹具过程崩溃

3:rake db:fixtures:load将在带有 以下错误/警告:无法确定的内容长度 响应机构。设置响应或集合的内容长度 响应#chunked=true

4:即使我们将此材料分解为1000字或更少的中等大小的文本字段,db:fixtures:load仍会在subject.yml文件上崩溃。

5:文件经常因崩溃而损坏。例如,我可以使用空字段分配从头开始重建装置;我可以一次添加和处理(db:fixtures:load)一个字段,直到达到明显的处理量限制,,当这最终导致fixture加载过程崩溃时,有时会在文件的最初几个字符中报告错误字符即使删除最后一个字段分配,该文件也不会再运行。

6:实验已经确定,夹具可以分配给单个记录的yml大约有50k限制。我有许多yml文件成功分配给多个记录,但没有一个文件成功分配给单个记录超过50k*。这种体验在几十张桌子上都是一致的

6.1:例如,建议此阈值的主文件仅创建一条记录:

6.1.1:如果我将空字段内容分配给所有文本字段,rake db:fixtures:load将成功创建其文本字段的空白记录

6.1.2:但如果我在跨过50k阈值(大约)后,一个字段一个字段地增加插入到单个记录中的大小(k),,则进程将崩溃,并出现以下错误:

def initialize(config)
  @config = config
  @logger = config[:Logger]
  @header = Hash.new
  @status = HTTPStatus::RC_OK
  @reason_phrase = nil
  @http_version = HTTPVersion::convert(@config[:HTTPVersion])
  @body = ''
  @keep_alive = true
  @cookies = []
  @request_method = nil
  @request_uri = nil
  @request_http_version = @http_version  # temporary
  @chunked = true # @chunked = false
  @filename = nil
  @sent_size = 0
end
雷克流产了!Mysql2::错误:从存储引擎获取错误139:插入 进入
[表格名称]

6.1.3:但增加MySQL缓冲区大小并没有解决问题。我有完全相同的限制。

6.1.3.1:以下是我在my.cnf中的MySQL缓冲区大小:

[mysqld]
key_buffer_size = 256M
max_allowed_packet = 1M
table_open_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size= 16M
6.1.4:我还将webrick/httpresponse.rb的所有实例中的chunked设置为true,如下所示:

def initialize(config)
  @config = config
  @logger = config[:Logger]
  @header = Hash.new
  @status = HTTPStatus::RC_OK
  @reason_phrase = nil
  @http_version = HTTPVersion::convert(@config[:HTTPVersion])
  @body = ''
  @keep_alive = true
  @cookies = []
  @request_method = nil
  @request_uri = nil
  @request_http_version = @http_version  # temporary
  @chunked = true # @chunked = false
  @filename = nil
  @sent_size = 0
end
这些尝试都没有对这个问题产生任何影响

7:因此我推断阈值适用于分配给单个记录的k,因为我有许多超过1M的yml文件。

相关问题?

8:我看到其他问题报告了相同的“设置响应内容长度”警告/错误。但我阅读的实例报告了在WebBrick中查看页面时发生的错误。在我们的情况下根本不是这样(尽管我们现在使用的是WebBrick)我们在使用Mongrel时遇到了同样的问题但我没有看到任何证据表明我们的问题与本地Ruby web服务器有关

9::我还看到,由于web服务器进程而出现此错误的用户正在通过应用204_304_keep_alive.patch进行修复。但是,特别是当我们在web服务器进程中没有遇到错误情况时,此修补程序可能与我们的问题相关,也可能与我们的问题无关

10:我在几个OSX系统和早期的Ruby 1.8/Rails 2上遇到过同样的问题

问题

其他必须将50k分配给具有固定装置的单个记录


有人知道我们必须在Ruby/Rails/OSX/MySQL环境中配置什么或以其他方式更改什么才能克服这一非常麻烦的负担吗?MySQL仅限于10个文本字段

要征服这一条,有一条弯路:

def initialize(config)
  @config = config
  @logger = config[:Logger]
  @header = Hash.new
  @status = HTTPStatus::RC_OK
  @reason_phrase = nil
  @http_version = HTTPVersion::convert(@config[:HTTPVersion])
  @body = ''
  @keep_alive = true
  @cookies = []
  @request_method = nil
  @request_uri = nil
  @request_http_version = @http_version  # temporary
  @chunked = true # @chunked = false
  @filename = nil
  @sent_size = 0
end
我解决问题的实验的逻辑过程是首先将一个较大的文本字段拆分为14个较小的文本字段

因此,如果我在增加缓冲区大小之前没有将原始文本字段拆分为14个单独的文本字段,那么增加MySQL缓冲区大小将解决我们的fixture/insert问题。我假设14个中等大小的文本字段不会对缓冲区大小增加的测试产生任何影响,当我添加14个文本字段中的第11个字段时,我刚好也超过了50k阈值。

更有理由编写清晰的错误处理程序。。。同时,超过10个文本字段限制*也会产生与缓冲区空间不足相同的错误

无论如何,我希望这次经历能引导其他人克服这两种情况。我有很多时间来修正我们的配置

无论如何,经验法则是:

  • 遵守MySQL的10个文本字段限制。
  • 在/etc/my.cnf中部署足够大小的缓冲区。

  • 有了备用RAM,我正在运行“我的大.cnf”,以满足我们项目的需要。

    针对我在Github上的错误错误报告,进一步阐述了此问题的解决方案: