当前位置: 首页 > 知识库问答 >
问题:

使用 Mysql 数据库从赫鲁库到远程服务器

卫宏硕
2023-03-14

我正在查看一个Rails应用程序,它需要建立远程SSH会话(SSH隧道?)从Heroku到远程Mysql数据库,作为后台ActiveRecord会话的一部分。目标是通过此通道在不同时间将数据迁移到应用程序中。无法通过web连接到远程mysql数据库。

几个问题:

  1. 赫鲁库允许SSH关闭他们的测功机吗?
  2. 这样做的缺点是什么?
  3. 我是否必须担心 SSH 会话持久性(作业可能需要 1 小时)?
  4. 最后,如何配置 Rails 和 Heroku 以启用数据库的远程连接。

共有2个答案

杜英范
2023-03-14

我尝试了@user1322092的方法,当多个客户端尝试访问数据库时遇到了麻烦,因为每个客户端都会尝试打开一个连接(除了第一个客户端之外的所有客户端都会出错)。

我创建了一个可怕的解决方案,涉及在测功机上生成一个SSH进程并将其用于所有通信。血腥的细节在 https://stackoverflow.com/a/27361295/558639。除了非常笨拙之外,每次启动进程时都会出现延迟,无论您是否正在访问远程数据库。

因此,这里有一个更好的方法似乎很有效:只需捕获(并忽略)错误即可:代码如下:

require 'net/ssh/gateway'

class Mole

  TUNNEL_HOST = <redacted>
  TUNNEL_USER = <redacted>
  AWS_HOST = <redacted>
  TUNNEL_PORT_NUMBER = 3307

  attr_reader :tunnel_gateway, :tunnel_port

  # Call this to open an SSH tunnel from the current machine.  If the
  # the tunnel was already opened (e.g. by another process) , you'll
  # get a warning message
  def open_tunnel
    @tunnel_gateway = Net::SSH::Gateway.new(TUNNEL_HOST, TUNNEL_USER)
    begin
      @tunnel_port = @tunnel_gateway.open(AWS_HOST, 3306, TUNNEL_PORT_NUMBER)
    rescue Errno::EADDRINUSE => e
      $stderr.puts("Warning: #{e.class}: #{e.message}")
    end
  end

  # You won't normally call this, because the tunnel is a system wide
  # resource; you don't know when other processes want to release it.
  def close_tunnel
    r = @tunnel_gateway.close(@tunnel_port) if @tunnel_gateway
    @tunnel_gateway.shutdown!
    r
  end

end
韦飞尘
2023-03-14

嗯,经过几天的挖掘,我现在能够回答我自己的问题了。简而言之,是的。

class LegacyAccount < ActiveRecord::Base

 self.table_name = "account"

 def self.test_connection

      # net-ssh-gateway gem
      gateway = Net::SSH::Gateway.new("ip_address","ssh_user_name",
          password: "password",
          port: "port if different from 22",
          verbose: :debug
          )

      port = gateway.open('127.0.0.1', 3306, 3307)

      establish_connection :legacy_production

      result = LegacyAccount.first
      puts "Record: #{result.to_yaml}"

      gateway.close(port)
      gateway.shutdown!

      result
  end

end

在您的database.yml中:

legacy_production:
  adapter: "mysql2"
  host: "127.0.0.1"
  username: "root"
  password: "password"
  database: "legacydb"
  port: 3307
  secure_auth: false
 类似资料:
  • 问题内容: 我刚刚在网络托管服务上设置了MySQL数据库,并尝试使用以下php远程连接至该数据库: 我对php和MySQL还是很陌生,我不了解几件事。我已将上面的代码保存在文件中(称为demo.html),并尝试在Web浏览器中查看它(当前它不显示任何内容)。 我的托管公司告诉我,应该使用数据库连接 我以为我需要包括IP地址(使用PhPMyAdmin登录时看到的地址),因此我也添加了该地址。但是,

  • 我有一个MySQL数据库存在于一个远程服务器上。我只有sql连接特权。我没有对服务器的FTP访问权限,我需要对数据库进行一次完整的转储。我试过,但问题是它在服务器上创建输出,由于我没有FTP,所以无法从服务器上获取输出。 我如何做一个干净的备份,并在我的本地机器中获得转储(当然,备份应该在我的本地机器中恢复)?

  • Windows 我们把在上一页面中从“tutorial2”推送到远程数据库的内容拉取到数据库目录“tutorial”吧。 用tutorial进行的操作 右击tutorial目录,然后从右击菜单中选择’拉取‘,即可执行pull操作。 用tutorial进行的操作 在以下画面点击“确定”。 用tutorial进行的操作 pull操作将在以下画面开始进行。完成pull后请点击“关闭”以退出画面。 用tu

  • 若是共享的远程数据库由多人同时作业,那么作业完毕后所有人都要把修改推送到远程数据库。然后,自己的本地数据库也需要更新其他人推送的变更内容。 Pull 进行拉取(Pull) 操作就可以把远程数据库的内容更新到本地数据库。 进行拉取(Pull) 操作,就是从远程数据库下载最近的变更日志,并覆盖自己本地数据库的相关内容。 接下来就是新手教程哦!学习一下怎样使用贝格乐远程数据库来共享数据库吧!

  • Windows 请右击“tutorial”目录,然后选择“推送”。 在以下画面点击‘管理’。 将出现以下画面,在"远端"输入"origin",在"URL"输入上一页中生成的远程数据库的URL,然后点击"添加/保存"。这样,"origin"将被添加到远程列表,然后点击"OK"。 Tips 执行推送或者拉取的时候,如果省略了远程数据库的名称,则默认使用名为”origin“的远程数据库。因此一般都会把远

  • 前面我们为大家介绍了本地数据库的基本使用方法。下面,我们接着为大家讲解如何在远程数据库上共享本地数据库的修改记录。 推送 为了将本地数据库的修改记录共享到远程数据库,必须上传本地数据库中存储的修改记录。 为此,需要在Git执行推送(Push)操作。执行Push之后,本地的修改记录会被上传到远程数据库。所以远程数据库的修改记录就会和本地数据库的修改记录保持同步。