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

28

我正在尝试将我的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

有没有想法这是怎么回事,以及如何解决?

1
你不使用 Taps (http://rubydoc.info/gems/taps/0.3.24/frames?) 是有特别的原因吗?它可以让你运行简单的 heroku db:pull 命令来填充本地数据库。我不确定这是否会解决你的问题,但它会更加方便 :) - theIV
其实你是对的。安装了taps gem之后,现在它完美地工作了。由于某种原因,即使我使用postgresql,taps gem仍然需要在gem文件中声明taps和sqlite3。想把你的作为答案试试吗? - Martin
完成了。关于宝石需求,即使您使用PG,声明这些要求仍然有点麻烦。 :/ - theIV
5个回答

56

你看到错误是因为psql试图解释SQL查询,而实际上你给他的是一个压缩的备份文件(这是Heroku使用的方式)。

虽然你不能读取备份文件,pg_restore -O latest.dump会给你有效的SQL命令,你可以将其导入到psql中,但简单的解决方案如下:

pg_restore -O -d app_development latest.dump

注意事项:

  • 使用-O,因为您可能不使用远程heroku postgres数据库的随机用户名。
  • Heroku不建议使用taps,但我不知道它实际上有多大风险。

有趣。我之前没有看到他们不建议使用它,因为他们开发了它并且通过CLI在内部使用。 - theIV
在那份文件中,你看到Heroku不推荐Taps的哪里? - Marnen Laibow-Koser
这是我回答这个问题的情况:http://web.archive.org/web/20120310004826/http://devcenter.heroku.com/articles/taps - Maxime R.

40

在终端中遵循这4个简单步骤
(Heroku Dev Center):

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

    $ heroku pg:backups capture DATABASE_NAME
    
  2. 使用curl将副本从Heroku下载(到本地计算机):

  3. $ curl -o latest.dump `heroku pg:backups public-url`
    
  4. 加载它*:

    $ 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)

就这样!


1
新的接口是:heroku pgbackups:capture 然后 curl -o latest.dump \heroku pg:backups public-url`` - grosser
我没有参考,这只是当我尝试运行命令时收到的消息。 - arniotaki
你可以查看这个链接:http://stackoverflow.com/questions/30143739/uplaod-local-database-data-to-heroku - arniotaki
1
谢谢!pg_restore非常出色。Heroku还可以让你点击按钮并下载数据库转储。我就是这样做的,将其重命名为“latest.dump”,看起来效果很好。 - Ryan
1
如果您不确定要在USERNAME中输入什么,请尝试使用“postgres”或计算机登录名(这在我的Mac上有效)。 - quicklikerabbit
显示剩余4条评论

0

针对目前最受欢迎的答案于2021年末进行更新(非常有效):

$ rails db:drop db:create db:migrate

$ heroku pg:backups capture DATABASE_URL

$ curl -o latest.dump heroku pg:backups public-url

$ pg_restore --verbose --clean --no-acl --no-owner -h localhost -U YOUR_USERNAME -d DATABASE_NAME latest.dump

  • 在本地机器上获取YOUR_USERNAME

  • DATABASE_NAME可以是你配置文件config/database.yml中的开发/测试/生产数据库(例如rails_react_bootstrap_development)。

  • DATABASE_URL不是需要设置的变量或示例代码。它是一个有效的Heroku选项。


0

我想避免在本地机器上设置Postgres(如果您只是寻找快速指令,那么清除和重新创建数据库会很麻烦)。我编写了一些确切的说明,以使用运行Docker的本地Postgres数据库执行此操作。我在此添加了一个链接,因为Google一直将我带到这个问题(虽然可能不是您要寻找的解决方案): https://gist.github.com/locofocos/badd43131f14b3e40c760741d5a26471


0

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

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

并重新启动Rails服务器。


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