【问题标题】:Postgres copy Heroku Production DB to local development DBPostgres 将 Heroku 生产数据库复制到本地开发数据库
【发布时间】:2014-05-30 02:02:35
【问题描述】:

我有一个 heroku 数据库,d76mj7ltuqs

然后我有一个本地数据库,test_development

这两个数据库的架构相同 - 我想从生产数据库中提取所有数据并覆盖我的本地数据库,以便在提取时本地是生产的精确副本。

如何在 Postgres 中做到这一点?

【问题讨论】:

标签: database postgresql heroku


【解决方案1】:

使用heroku的“pg:pull”:

您需要清除本地数据库:

rake db:drop

然后从 Heroku 收集一些信息:

heroku pg:pull DATABASE_URL test_development

这将连接到heroku DB,并将其复制到本地数据库。

更多详情请见Heroku's documentation on pg:pull

【讨论】:

  • 不确定这是否是新事物,但在定义应用程序时,您需要在应用程序名称前输入--app
  • 这里也一样。我需要:heroku pg:pull DATABASE_URL database_local_name --app myapp
  • 首先,我认为我需要将 DATABASE_URL 替换为我的 heroku 配置对应值,但不是。
【解决方案2】:

清理本地数据库:

rake db:schema:load

转储你的heroku数据库:

heroku pg:backups:capture -r <**your production git repo name**>
heroku pg:backups:download -r <**your production git repo name**>

在本地数据库中加载数据

pg_restore --verbose --clean --no-acl --no-owner -h localhost -d <**test database name**> latest.dump

【讨论】:

    【解决方案3】:

    这个命令应该可以完成工作:

    heroku pg:pull DATABASE_URL database-name --app heroku-app-name
    

    【讨论】:

    • 很惊讶这没有得到更多的支持。
    【解决方案4】:

    我就是这样做的,一定要随着数据库的增长对其进行 gzip 压缩。也不要导出 ACL,因为您可能在 heroku 和本地帐户上没有相同的 postgres 用户。替换为您的具体详细信息。

     pg_dump -h ec2-##-##-##-##.compute-1.amazonaws.com -p <port> -Fc --no-acl --no-owner -o -U <username> <databasename> | gzip > dumpfile.gz
     #<Prompt for Password>
     gunzip -c dumpfile.gz | pg_restore --verbose --clean --no-acl --no-owner -d test_development -U <local_username>
    

    【讨论】:

    • pg_dump 可以在没有外部gzip 的情况下压缩转储。查看--compress=0..9 选项。
    【解决方案5】:

    使用您的终端创建一个本地pg_dump,然后将psqlpg_restore 输入到您的本地数据库中。

    类似的方法可以在here找到。

    【讨论】:

      【解决方案6】:

      如果这是一个 Rails 应用程序,您可以使用以下脚本使用您在 Heroku 上生成的最新转储覆盖您的本地数据库。如果您取消注释 heroku pg:backups capture 行,脚本将在 Heroku 上生成一个新快照,然后再将其下载到您的计算机。

      请注意,您不必编辑脚本,因为它会从您的 database.yml 文件中读取所有配置。

      #!/usr/bin/env ruby
      
      require_relative '../config/environment'
      
      # Uncomment the line below if you want to generate a new snapshot of the
      # Heroku production database before downloading it to the local machine
      # `heroku pg:backups capture`
      
      database_dump_file_pathname = Tempfile.new('latest.dump').path
      `heroku pg:backups:download --output #{database_dump_file_pathname}`
      
      # Get database config fom database.yml file
      database_config = YAML::load_file(Rails.root.join('config', 'database.yml'))
      database_name = database_config['development']['database']
      database_username = database_config['development']['username']
      database_password = database_config['development']['password']
      
      # Overwrite local database with dump
      cmd_line_arguments = [
        '--verbose',
        '--clean',
        '--no-acl',
        '--no-owner',
        '--host localhost',
        "-U #{database_username}",
        "-d #{database_name}",
        database_dump_file_pathname
      ].join(' ')
      `PGPASSWORD=#{database_password} pg_restore #{cmd_line_arguments}`
      

      详情请参阅Heroku docs on downloading DB backups

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-08-11
        • 1970-01-01
        • 2015-09-10
        • 2013-07-11
        • 1970-01-01
        • 2019-09-03
        • 1970-01-01
        相关资源
        最近更新 更多