net-ssh и ActiveRecord 3: объединяем все вместе

Я работаю над небольшой программой на Ruby, которая будет подключаться к удаленной базе данных MySQL Bugzilla, выполнять запрос записей и отправлять данные об этих записях группе на ежедневной основе.

До сих пор я мог подключиться к серверу db по SSH и выполнить команду с помощью net-ssh. Вот пример:

require 'net/ssh'

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

Это просто отлично.

Используя ActiveRecord 3.0.3, я хотел протестировать метод establish_connection, поэтому я установил соединение с моей локальной базой данных MySQL и смог выполнять команды с помощью ActiveRecord. Пример:

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

Итак, где у меня проблемы, так это собрать все это воедино и применить к моей удаленной базе данных MySQL. Вот моя лучшая попытка:

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

Но все, что это делает, - это зависает мой сеанс IRB (что может быть совершенно нормальным ... не знаю). Если зависание было нормальным, я открыл новый сеанс IRB и попытался установить соединение с удаленной базой данных следующим образом:

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

Итак, я понятия не имею, что происходит не так и как его очистить. Любые предложения были бы полезны.

Я использую Mac OSX. База данных, к которой я пытаюсь подключиться, находится на FreeBSD 7.0 и MySQL версии Ver 14.12 Distrib 5.0.67.


person Spencer R    schedule 05.02.2011    source источник
comment
Вы пытаетесь заставить свой драйвер mysql общаться через туннель ssh?   -  person Mark Thomas    schedule 06.02.2011


Ответы (1)


Вместо того, чтобы пытаться туннелировать соединение ActiveRecord внутри SSH, пробовали ли вы подключиться напрямую из ActiveRecord к серверу БД? Это нормальный способ подключения по сети, который напрямую поддерживается ActiveRecord.

Замените идентификатор хоста IP-адресом хоста сервера или записью DNS, для порта, вероятно, можно будет разрешить значение по умолчанию для драйвера MySQL 3306, и сокет не нужен, поскольку БД находится на удаленном хосте.

Если хост БД не находится в той же сети, что и ваш, и вы пересекаете брандмауэры, вам может потребоваться открыть этот порт, чтобы разрешить соединение. Если он находится в той же сети, он должен работать без использования ssh.

person the Tin Man    schedule 06.02.2011
comment
Это может быть связано с сервером. Они могут не разрешать соединения с вашего компьютера, компьютеров в вашей сети или, наоборот, разрешать соединения только с определенных компьютеров. - person the Tin Man; 06.02.2011
comment
Возможно, вы захотите спросить об этом на Администраторах баз данных, который является новым сестринским сайтом для Stack Overflow, только специально для администраторов баз данных и опытных пользователей. - person the Tin Man; 06.02.2011