【问题标题】:How to pull mysql database from heroku to local machine如何将mysql数据库从heroku拉到本地机器
【发布时间】:2015-02-26 07:33:17
【问题描述】:

您好,我在 heroku 上托管了一个 ruby​​ on rails 应用程序,它使用 mysql 作为数据库。

现在我必须将数据库备份到我的本地机器上。但是我在备份时遇到了问题。

为此,我安装了taps gem,并为此使用以下命令

heroku pg:pull mysql2://username@hostname.cleardb.com/heroku_database  local_database --app my_app

但它给出错误!Your app has no databases.

谁能指导我如何将mysql数据库从heroku拉到本地机器。

编辑

我对命令使用了以下语法

heroku pg:pull <REMOTE_SOURCE_DATABASE> <LOCAL_TARGET_DATABASE>

为了获取 REMOTE_SOURCE_DATABASE 我使用了以下命令

 heroku config:get DATABASE_URL --app my_app

我参考this link1link2 以获得更详细的heroku 文档。

标签: mysql ruby-on-rails ruby heroku


【解决方案1】:

pg:pull 命令仅适用于 Heroku 应用中的 Postgres 数据库。但是,您使用的是第三方 MySQL 提供程序。您的数据库托管在 ClearDB 服务器上,任何拥有正确凭据的人都可以使用它,包括您在 Heroku 上的应用服务器和您的开发机器。

即使没有特殊的命令来拉取数据库,您也不需要任何命令 - 普通的 mysqldump 应该可以。

mysqldump -h hostname.cleardb.com -u username heroku_database | mysql local_database

【讨论】:

  • 收到mysqldump: Got error: 1045: Access denied for user 'users'@'ip-xx-xx-xx-xx.xx.internal' (using password: NO) when trying to connect 错误。
  • 添加-p 选项,系统将提示您输入密码
  • @I-am-simple-user 您的“用户名”中是否有冒号,例如username:password?因为它同时包含用户名和密码。
  • 不,我刚刚添加了username,而不是密码。
【解决方案2】:

运行$heroku config | grep ^DATABASE 会给你这样的东西:

DATABASE_URL: mysql2://username:password@host/dbname?reconnect=true`

您可以从那里构建您的 db dump 命令:

mysqldump -h host -p -u username dbname | mysql local_database

这将提示您输入从上一个命令收到的密码。如果您想创建一个自动包含 heroku 命令密码的脚本,您可以执行以下操作:

mysqldump -u username --password=`heroku config | grep ^DATABASE | sed 's/.*[a-z0-9][a-z0-9]*:\([a-z][a-z0-9]*\).*/\1/'` -h host dbname | mysql cedric

通过这种方式,您可以拥有一个脚本,该脚本无需任何用户输入即可导入数据库,但也不会将密码暴露给您的数据库。

【讨论】:

  • 非常有用!
【解决方案3】:

(重要免责声明:必须正确配置您的 database.yml 才能使其正常工作。我不对任何由于运行以下脚本而丢失的数据。)

对于 Ruby on Rails 用户...您可以考虑编写一个 Rake 任务,如下面的这些 db:clone 任务。

我发现自己经常使用这个脚本从生产环境克隆到开发环境。这比记住 mysqldump 语法要容易得多,更不用说涉及的所有用户名和密码了......

从生产克隆到开发:

rake db:clone:production

从登台克隆到开发:

rake db:clone:staging

从生产克隆到登台:

rake db:clone:production_to_staging

这里的代码享受(并且在设置你的 database.yml 时要小心):

namespace :db do
  namespace :clone do

    class << self
      %w(development test staging production).each do |env|
        define_method("#{env}_db") do
          Rails.configuration.database_configuration[env]
        end
      end
    end

    def clone_db(from_db, to_db)
      start_time = Time.now
      puts "Cloning Remote DB...."
      system("mysqldump -h#{from_db['host']} -u#{from_db['username']} -p#{from_db['password']} #{from_db['database']} | mysql #{to_db['database']} -u#{to_db['username']} -p#{to_db['password']}")
      puts "Import Successful"
      end_time = Time.now
      puts "===================="
      puts "Job Completed: #{end_time - start_time} Seconds"
    end

    task :staging => :environment do
      clone_db(staging_db, development_db)
    end

    task :production => :environment do
      clone_db(production_db, development_db)
    end

    task :production_to_staging => :environment do
      clone_db(production_db, staging_db) if Rails.env.staging?
    end

  end
end

【讨论】:

    猜你喜欢
    • 2018-08-20
    • 1970-01-01
    • 2013-02-17
    • 2016-08-15
    • 2011-04-12
    • 1970-01-01
    • 2012-06-22
    • 2014-04-19
    • 2018-12-13
    相关资源
    最近更新 更多