如何将Heroku上的MySQL数据库转移到本地机器

9

您好,我有一个Ruby on Rails应用程序托管在Heroku上,它使用MySQL作为数据库。

现在我需要将数据库备份到我的本地计算机。但是在备份时遇到了问题。

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

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

但是它给出了错误提示:!您的应用程序没有数据库。

有人可以指导我如何将Heroku上的MySQL数据库拉到本地计算机吗?

编辑

我已经使用以下语法来执行命令:

heroku pg:pull <REMOTE_SOURCE_DATABASE> <LOCAL_TARGET_DATABASE>

我使用以下命令获取REMOTE_SOURCE_DATABASE:
 heroku config:get DATABASE_URL --app my_app

我参考这个链接1链接2以获取更详细的Heroku文档。


我不是MySql专家,但我认为一种方法是:使用MySql管理工具之一连接到远程数据库,并使用ClearDB提供的DATABASE_URL将数据转储到本地机器,然后将此转储数据加载到您现有的本地数据库中。然后迁移到PostgreSQL,并一直保持愉快,因为Heroku对这种类型的关系型数据库有惊人的支持。 - atomdev
还有一个评论:我认为 heroku pg:pull 命令只适用于 Heroku Postgres 服务,因此如果您没有 pg 数据库,则会看到错误。在早期的时候,当 heroku 支持 taps 时,有一个命令叫做 _heroku db:pull_,用户可以在不同类型的数据库之间迁移数据,但现在这个功能已经消失了。 - atomdev
@rubykid 所以没有直接的方法。 - I-am-simple-user
这很奇怪。Heroku使用PostGRES...你确定你在Heroku中使用的是MySQL吗?你看到了PG插件吗? - Don P
是的,我已经检查过了。 - I-am-simple-user
显示剩余2条评论
3个回答

8
pg:pull 命令只适用于 Heroku 应用程序中的 Postgres 数据库。但是,您正在使用第三方的 MySQL 提供商。您的数据库托管在 ClearDB 服务器上,并且任何具有正确凭据的人都可以访问它,包括 Heroku 上的应用程序服务器和开发机器。
即使没有特殊的命令来拉取数据库,您也不需要任何命令-普通的mysqldump就足够了。 mysqldump -h hostname.cleardb.com -u username heroku_database | mysql local_database

1
出现 mysqldump: Got error: 1045: Access denied for user 'users'@'ip-xx-xx-xx-xx.xx.internal' (using password: NO) when trying to connect 错误。 - shrikant1712
1
添加一个 -p 选项,然后会提示您输入密码。 - infused
@I-am-simple-user,请问你的“用户名”中是否有冒号,比如username:password?因为这样它包含了用户名和密码。 - Leonid Shevtsov
不是的,我只添加了“用户名”,没有添加密码。 - I-am-simple-user

2

(重要声明:在运行下面的脚本之前,您必须正确配置您的database.yml文件。我不对您因运行以下脚本而丢失的任何数据负责。)

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

我经常使用此脚本从生产环境克隆到开发环境。它比记住mysqldump语法和所有涉及的用户名和密码要容易得多...

从生产环境克隆到开发环境:

rake db:clone:production

从staging环境克隆到开发环境:

rake db:clone:staging

从生产环境克隆到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

这个脚本可能会起作用,但请注意,在非生产环境中永远不要使用真实的生产数据。始终先对数据进行匿名化处理。 - jewilmeer

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

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


1
非常有用! - Vladimir Vukanac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接