如何将Heroku PG转储导入本地计算机

时间:2012-06-01 14:56:13

标签: ruby-on-rails postgresql

我正在尝试将我的生产Heroku数据库导入我的开发机器。

我的本​​地数据库是PostgreSQL。

首先,我将转储从Heroku导出到我的机器

curl -o latest.dump `heroku pgbackups:url`

然后,我尝试使用rake db:drop删除本地数据库,然后使用rake db:create再次创建空数据库。

我遇到的问题是实际尝试将转储导入数据库时​​

psql -d app_development -U myusername -f mydumpfile.sql

我开始看到像这样的错误

psql:latest.dump:24: ERROR:  syntax error at or near "PGDMP"
LINE 1: PGDMP
        ^
psql:latest.dump:28: ERROR:  syntax error at or near ""
LINE 1:     INCREMENT BY 1
        ^
psql:latest.dump:36: ERROR:  syntax error at or near ""
LINE 1:     id integer NOT NULL,
        ^
psql:latest.dump:40: ERROR:  syntax error at or near ""
LINE 1:     INCREMENT BY 1
        ^
psql:latest.dump:45: ERROR:  syntax error at or near ""
LINE 1:     id integer NOT NULL,
        ^
psql:latest.dump:49: ERROR:  syntax error at or near ""
LINE 1:     INCREMENT BY 1

... 

psql:latest.dump:1601: invalid command \S4???(?̭?A?|c?e0<00K?A?}FϚ?????A(??~?t?I?????G(?    K???l??k"?H?ȁ?ͲS?,N*?[(@??a5J??j}
psql:latest.dump:1602: invalid command \??k???|??w???h?
psql:latest.dump:1603: invalid command \=??????o?h?
psql:latest.dump:1609: invalid command \????^.?????????E???/-???+??>#?ؚE?.2)Ȯ&????    g????"7},_??]?:?f?Tr|o???)?p????h?KO?08[Rqu???|3?cW?ڮ?ahbm??H?H8??$???2?a?-أ
psql:latest.dump:1613: invalid command \D!qVS???L??*??׬R??I!???
psql:latest.dump:1614: invalid command \??-?}Q
psql:latest.dump:12565: ERROR:  invalid byte sequence for encoding "UTF8": 0xb0

知道发生了什么以及如何解决它?

5 个答案:

答案 0 :(得分:53)

您看到错误,因为psql在您实际给他compressed dump时尝试解释SQL查询(这就是heroku使用的)。

虽然您无法读取转储,但pg_restore -O latest.dump为您提供了有效的SQL,您可以将其传递给psql,但简单的解决方案如下:

pg_restore -O -d app_development latest.dump

注意:

  • 使用-O,因为您可能不使用远程heroku postgres db的随机用户名。
  • Heroku doesn't recommend to use taps但我不知道它有多么危险。

答案 1 :(得分:36)

按照终端中的这4个简单步骤(Heroku Dev Center):

  1. 创建数据库的备份副本:

    $ heroku pg:backups capture DATABASE_NAME
    
  2. 使用curl:

    从Heroku(到您的本地计算机)下载副本
    $ curl -o latest.dump `heroku pg:backups public-url`
    
  3. 加载*:

    $ pg_restore --verbose --clean --no-acl --no-owner -h localhost -U YOUR_USERNAME -d DATABASE_NAME latest.dump
    
    • 获取YOUR_USERNAME并从config/database.yml文件中选择所需的数据库。
    • DATABASE_NAME可以是您的开发/测试/生产数据库(例如mydb_development)
  4. 就是这样!

答案 2 :(得分:3)

使用Taps gem。它允许您运行一个简单的heroku db:pull来填充本地数据库。

答案 3 :(得分:0)

我想避免在我的本地计算机上设置Postgres(如果您只是寻找快速说明,吹走并重新创建数据库会很痛苦)。我在运行Docker的本地Postgres数据库中汇总了一些确切的说明。我在这里添加一个链接,因为谷歌一直带我到这个问题(这是一个可能的解决方案,虽然可能不是你想要的): https://gist.github.com/locofocos/badd43131f14b3e40c760741d5a26471

答案 4 :(得分:0)

Heroku导出数据库的 .dump 扩展文件,以通过拥有自己的规范和条件将其导入任何关系数据库中。 将其导入本地Postgres DB时,首先将文件 latest.dump 下载到本地计算机中,然后运行

pg_restore -h localhost -p 5432 -U postgres_username -d db_name -v latest.dump

然后重新启动Rails服务器。