Pregunta

Estoy trabajando en un pequeño programa de Ruby que se conectará a una remota base de datos MySQL Bugzilla, realizará una consulta de registros y los detalles de correo electrónico de esos registros a un grupo a diario.

Hasta ahora, he podido SSH al servidor DB y ejecutar un comando usando Net-SSH. Aquí hay un ejemplo:

require 'net/ssh'

Net::SSH.start("db.example.com", "sroach", :password => "secret") do |ssh|
result = ssh.exec!("ls -l")
puts result
end

Eso sale bien.

Usando Activerecord 3.0.3, quería probar el establish_connection Método Así que establecí una conexión con mi base de datos MySQL local y pude ejecutar comandos usando Activerecord. Ejemplo:

require 'active_record'

ActiveRecord::Base.establish_connection(
    :adapter  => "mysql2",
    :host     => "localhost",
    :database => "list_tool_development",
    :username => "my_username",
    :password => "secretpassword"
)

class MailingList < ActiveRecord::Base
end

MailingList.first  #=> Successfully retrieves first record from the table

Entonces, donde tengo problemas es reunirlo todo y aplicarlo a mi remoto MySQL DB. Aquí está mi mejor intento hasta ahora:

require 'net/ssh'

Net::SSH.start("db.example.com", "sroach", :password => "secret") do |ssh|
ssh.forward.local(3307, "127.0.0.1", 3306)
ssh.loop { true }
end

Pero todo lo que hace es hacer que mi sesión de IRB cuelgue (lo que podría ser completamente normal ... no lo sé). En caso de que cuelgue estaba Normal, abrí una nueva sesión de IRB e intenté establecer una conexión con la base de datos remota como así:

require 'active_record'

ActiveRecord::Base.establish_connection(
    :adapter => "mysql2",
    :host => "127.0.0.1",
    :port => 3307,
    :reconnect => false,
    :database => "bugs",
    :pool => 5,
    :username => "my_username",
    :password => "secret",
    :socket => "/tmp/mysql.sock"
)

class Bug < ActiveRecord::Base  #=> the table name in the "bugs" db is "bugs"
end                             #=> so I made the model singular

Bug.first  #=> the IRB session hangs at this point

Entonces, no tengo idea de lo que está pasando mal o cómo delgularlo. Todas y cada una de las sugerencias sería útil.

Estoy en Mac OSX. El DB con el que estoy tratando de conectar es en FreeBSD 7.0 y es la versión MySQL ver 14.12 Distrib 5.0.67.

¿Fue útil?

Solución

En lugar de intentar túnel la conexión Activerecord dentro de SSH, ¿ha intentado conectarse directamente de Activerecord al servidor DB? Esa es la forma normal de conectarse a través de una red y es compatible directamente por Activerecord.

Reemplace la ID de host con la entrada IP o DNS del host del servidor, el puerto probablemente puede ser predeterminado por el valor predeterminado del controlador MySQL de 3306, y el socket no es necesario ya que el DB está en el host remoto.

Si el host de DB no está en la misma red que la suya, y está cruzando los firewalls, es posible que deba tener ese puerto abierto para permitir la conexión. Si está en la misma red, debería funcionar sin necesidad de SSH.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top