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

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

4

6 回答 6

55

您会看到错误,因为当您实际给他一个压缩转储(这就是 heroku 使用的)时,psql 会尝试解释 SQL 查询。

虽然您无法读取转储,pg_restore -O latest.dump但为您提供了可以通过管道传输到 psql 的有效 SQL,但简单的解决方案如下:

pg_restore -O -d app_development latest.dump

备注:

  • 使用-O是因为您可能不使用远程 heroku postgres 数据库的随机用户名。
  • Heroku不建议使用水龙头,但我不知道它的风险有多大。
于 2012-07-09T08:37:28.063 回答
39


在您的终端(Heroku 开发中心)中执行以下 4 个简单步骤:

  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
    
    • config/database.yml获取 YOUR_USERNAME 并从您的文件中选择所需的数据库。
    • DATABASE_NAME 可以是您的开发/测试/生产数据库(例如 mydb_development)

而已!

于 2014-03-19T02:58:00.543 回答
3

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

于 2012-06-01T15:33:10.003 回答
0

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

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

并重新启动 rails 服务器。

于 2020-06-10T07:01:05.677 回答
0

2021 年末更新迄今为止投票最高的答案(效果很好):

$ rails db:drop db:create db:migrate

$ heroku pg:backups 捕获 DATABASE_URL

$ curl -o 最新的.dumpheroku 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选项

于 2021-12-05T10:44:06.563 回答
0

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

于 2017-12-01T05:32:17.400 回答