【问题标题】:net-ssh and ActiveRecord 3: bringing it all togethernet-ssh 和 ActiveRecord 3:将它们结合在一起
【发布时间】:2011-02-06 09:11:26
【问题描述】:

我正在开发一个小型 Rub​​y 程序,该程序将连接到远程 MySQL Bugzilla 数据库,执行记录查询,并每天将这些记录的详细信息通过电子邮件发送给一个组。

到目前为止,我已经能够通过 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。

【问题讨论】:

  • 您是否正在尝试让您的 mysql 驱动程序通过 ssh 隧道进行通信?

标签: ruby activerecord net-ssh


【解决方案1】:

您是否尝试过直接从 ActiveRecord 连接到数据库服务器,而不是尝试在 SSH 中建立 ActiveRecord 连接?这是通过网络连接的正常方式,ActiveRecord 直接支持。

将主机 ID 替换为服务器主机 IP 或 DNS 条目,可能允许端口默认为 MySQL 驱动程序默认的 3306,并且不需要套接字,因为 DB 在远程主机上。

如果数据库主机与您的网络不在同一个网络上,并且您正在穿越防火墙,您可能需要打开该端口以允许连接。如果它在同一个网络上,它应该可以在根本不需要 ssh 的情况下工作。

【讨论】:

  • 可能与服务器有关。它们可能不允许来自您的机器、网络上的机器的连接,或者相反,只允许来自特定机器的连接。
  • 您可能想在 Database Administrators 上提出这个问题,这是 Stack Overflow 的新姊妹站点,仅专门针对数据库管理员和高级用户。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-08
  • 2012-10-20
  • 1970-01-01
  • 2018-04-13
  • 2015-03-16
相关资源
最近更新 更多