references rails left joins includes active ruby-on-rails-3 activerecord mysql2

ruby-on-rails-3 - left - ruby rails active record



Error Rails 3.1/mysql2: "El servidor MySQL se ha ido" (2)

Tengo problemas para actualizar mis carriles 2.3.14 / ruby ​​1.8.7 app a 3.1.1 / 1.9.2: tengo algunos

(ActiveRecord::StatementInvalid) "Mysql2::Error: MySQL server has gone away"

errores que ocurren esporádicamente. Es importante precisar que nunca tuve tales problemas con la gema ''mysql'' en 2.3.14 y el mismo db exacto (entonces el error no debería provenir de mysql (v5.5.10)).

Ejemplo:

$ rails c production Loading production environment (Rails 3.1.1) ruby-1.9.2-p290 :001 > ActiveRecord::Base.connection.active? => false ruby-1.9.2-p290 :002 > exit $ rails c production Loading production environment (Rails 3.1.1) ruby-1.9.2-p290 :001 > ActiveRecord::Base.connection.active? => true

Esto ocurre solo con mi base de datos de producción (remota), no hay problema con mi db de desarrollo local. Intenté establecer "reconexión: verdadero" en mi base de datos.yml pero me llevó a

Mysql2::Error: Host ''****'' is blocked because of many connection errors; unblock with ''mysqladmin flush-hosts'':...

Intenté aislar el problema con un pequeño script rb solo cargando mysql2 y activerecord, pero no logré reproducir el error de esa manera (por lo que puede estar vinculado a la pila de rieles).

No puedo volver de la gema ''mysql2'' a la ''mysql'' debido a problemas de codificación ( http://www.rorra.com.ar/2010/07/30/rails-3-mysql-and-utf- 8 / ). Como consecuencia, tuve que retrotraer mi producción a mi aplicación de carriles 2.3.14, lo que me entristece mucho ...

¿Ves lo que puedo hacer para depurar esto? Ni siquiera puedo encontrar una manera segura de reproducir el error ... ¿Alguien ha encontrado el mismo error?

Acabo de encontrar algunas personas que mencionaron este error (por ejemplo: https://github.com/brianmario/mysql2/issues/213 ) pero no una solución.

Gracias por tu ayuda.


Ok, creo que resolví mi problema. No me di cuenta cuando publiqué mi pregunta, pero parecía que el error estaba relacionado con el tiempo de espera: después de unos 20 segundos, activerecord pierde su conexión.

$ rails runner "sleep 23; puts ActiveRecord::Base.connection.active?" => true $ rails runner "sleep 25; puts ActiveRecord::Base.connection.active?" => false

Así que profundicé más y me di cuenta de que las gemas mysql y mysql2 no trataban del param de MySQL ''wait_timeout'' de la misma manera: mysql gem no lo establece así que usa el valor por defecto de MySQL 28800 , mientras que mysql2 joya lo establece en 2592000 si no definido en la base de datos.yml. Pero tengo la impresión de que el valor 2592000 está por encima del valor máximo para este parámetro : ¡ 2147483 ! Lo que podría conducir al comportamiento inesperado que describí ...

Construyo una prueba de script que muestra el error: https://gist.github.com/1514154

Y si tuve una desconexión aparentemente aleatoria al cargar la consola de los rieles (cf mi pregunta), creo que es porque mi aplicación tarda mucho tiempo en cargar y, a veces, espero unos segundos antes de escribir mi comando.

No puedo explicar por qué somos tan pocos para enfrentar este problema. Quizás es específico de mi conf (base de datos remota, ¿versión de MySQL?). Lo intenté con otra base de datos de etapas alejadas: el error no se reprodujo ...

A modo de conclusión, estableceré wait_timeout: 2147483 en mi base de wait_timeout: 2147483 . Y tal vez tirar de los rieles de solicitud ...


Tenía muchas conexiones perdidas, pero no podría decir si se fueron debido al siguiente ajuste o de otra manera:

Tuve que lanzar la siguiente secuencia de comandos a los inicializadores y agregar una línea de configuración a cada una de mis bases de datos en my database.yml como esta:

... flags: <%= 65536 | 131072 %> ...

El script se ve así:

/config/initializers/mysql2.rb

module ActiveRecord class Base # Overriding ActiveRecord::Base.mysql2_connection # method to allow passing options from database.yml # # Example of database.yml # # login: &login # socket: /tmp/mysql.sock # adapter: mysql2 # host: localhost # encoding: utf8 # flags: 131072 # # @param [Hash] config hash that you define in your # database.yml # @return [Mysql2Adapter] new MySQL adapter object # def self.mysql2_connection(config) config[:username] = ''root'' if config[:username].nil? if Mysql2::Client.const_defined? :FOUND_ROWS config[:flags] = config[:flags] ? config[:flags] | Mysql2::Client::FOUND_ROWS : Mysql2::Client::FOUND_ROWS end client = Mysql2::Client.new(config.symbolize_keys) options = [config[:host], config[:username], config[:password], config[:database], config[:port], config[:socket], 0] ConnectionAdapters::Mysql2Adapter.new(client, logger, options, config) end end end