web-dev-qa-db-fra.com

Comment importer un dump Heroku PG dans une machine locale

J'essaie d'importer ma base de données de production Heroku dans ma machine de développement.

Ma base de données locale est PostgreSQL. 

D'abord, j'exporte le dump de Heroku vers ma machine

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

Ensuite, j'essaie de supprimer la base de données locale avec rake db:drop, puis je crée à nouveau la base de données vide en utilisant rake db:create

Le problème que je reçois est lorsque j'essaie réellement d'importer le dump dans la base de données

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

Je commence à voir des erreurs comme celle-ci

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

Avez-vous une idée de ce qui se passe et comment le résoudre? 

27
Martin

Vous voyez des erreurs car psql essaie d'interpréter les requêtes SQL alors que vous lui donnez un compressé dump (c'est ce que heroku utilise).

Bien que vous ne puissiez pas lire le dump, pg_restore -O latest.dump vous donne un code SQL valide, vous pouvez le diriger vers psql mais la solution la plus simple est la suivante:

pg_restore -O -d app_development latest.dump

Remarques :

  • Utilisez -O parce que vous n'utilisez probablement pas le nom d'utilisateur aléatoire de votre base de données distante heroku postgres.
  • Heroku ne recommande pas d'utiliser des robinets mais je ne sais pas à quel point c'est risqué.
53
Maxime R.

Suivez ces 4 étapes simples dans votre terminal
( Centre de développement Heroku ):

  1. Créez une copie de sauvegarde de votre base de données:

    $ heroku pg:backups capture DATABASE_NAME
    
  2. Téléchargez la copie de Heroku (sur votre machine locale) en utilisant curl:

    $ curl -o latest.dump 'heroku pg:backups public-url'
    
  3. Charge le*:

    $ pg_restore --verbose --clean --no-acl --no-owner -h localhost -U YOUR_USERNAME -d DATABASE_NAME latest.dump
    
    • récupérez YOUR_USERNAME et choisissez la base de données souhaitée dans votre fichier config/database.yml.
    • DATABASE_NAME peut être votre base de développement/test/production (ex. Mydb_development)

C'est ça!

34
Lior Elrom

Utilisez le Taps gem. Il vous permet d’exécuter un simple heroku db:pull pour renseigner une base de données locale.

3
theIV

Je voulais éviter de configurer Postgres sur mon ordinateur local (il est difficile de reconstituer et de reconstituer la base de données si vous cherchez simplement des instructions rapides). J'ai rassemblé des instructions précises pour le faire avec une base de données Postgres locale exécutant Docker. J'ajoute un lien ici, car Google n'arrêtait pas de m'amener à cette question (et c'est une solution possible, mais probablement pas ce que vous cherchez): https://Gist.github.com/locofocos/badd43131f14b3e40c760741d5a26471

0
Patrick