0

私は、リモートのMySQL Bugzillaデータベースに接続し、レコードのクエリを実行し、それらのレコードの詳細をグループに毎日電子メールで送信する小さなRubyプログラムに取り組んでいます。

これまでのところ、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

だから、私は何が間違っているのか、それをどのようにデグブするのか分かりません。ありとあらゆる提案が役に立ちます。

私はMacOSXを使用しています。私が接続しようとしているデータベースはFreeBSD7.0にあり、MySQLバージョンVer 14.12Distrib5.0.67です。

4

1 に答える 1

0

SSH内でActiveRecord接続をトンネリングしようとするのではなく、ActiveRecordからDBサーバーに直接接続しようとしましたか?これはネットワークを介して接続する通常の方法であり、ActiveRecordによって直接サポートされています。

ホストIDをサーバーホストのIPまたはDNSエントリに置き換えます。ポートは、MySQLドライバーのデフォルトの3306にデフォルト設定される可能性があり、DBはリモートホスト上にあるため、ソケットは必要ありません。

DBホストが自分のネットワークと同じネットワーク上になく、ファイアウォールを越えている場合は、接続を許可するためにそのポートを開く必要がある場合があります。同じネットワーク上にある場合は、sshをまったく必要とせずに動作するはずです。

于 2011-02-06T01:11:26.497 に答える