如何将 mysql 数据库从 heroku 拉到本地机器

How to pull mysql database from heroku to local machine

您好,我在 rails 应用程序上有一个 ruby 托管在 heroku 上,它使用 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 link1 and link2 以获得更详细的 heroku 文档。

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

即使没有特殊的命令来提取数据库,您也不需要任何命令 - 简单的 mysqldump 就可以了。

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

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

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

从那里你可以构建你的数据库转储命令:

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]*\).*//'` -h host dbname | mysql cedric

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

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

For Ruby on Rails users ...你可以考虑像这样写一个 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