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

Mar*_*tin 28 postgresql ruby-on-rails

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

我的本地数据库是PostgreSQL.

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

curl -o latest.dump `heroku pgbackups:url`
Run Code Online (Sandbox Code Playgroud)

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

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

psql -d app_development -U myusername -f mydumpfile.sql
Run Code Online (Sandbox Code Playgroud)

我开始看到这样的错误

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
Run Code Online (Sandbox Code Playgroud)

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

Max*_* R. 54

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

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

pg_restore -O -d app_development latest.dump
Run Code Online (Sandbox Code Playgroud)

备注:

  • 使用-O是因为您可能不使用远程heroku postgres db的随机用户名.
  • Heroku 不建议使用水龙头,但我不知道它有多么危险.


Lio*_*rom 36

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

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

    $ heroku pg:backups capture DATABASE_NAME
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用curl从Heroku(到您的本地机器)下载副本:

    $ curl -o latest.dump `heroku pg:backups public-url`
    
    Run Code Online (Sandbox Code Playgroud)
  3. 加载*:

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

而已!