2012-06-01 35 views
26

Estoy tratando de importar mi base de datos Heroku de producción a mi máquina de desarrollo.Cómo importar un volcado Heroku PG en la máquina local

Mi db local es PostgreSQL.

En primer lugar, voy a exportar el volcado de Heroku a mi máquina

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

Entonces, trato de dejar el PP local con rake db:drop y luego crear la base de datos vacía de nuevo utilizando rake db:create.

El problema que estoy recibiendo es cuando realmente intentar importar el volcado de la base de datos

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

comienzo teniendo errores como éste

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 

Alguna idea de lo que está sucediendo esto y cómo ¿resuélvelo?

+1

¿Hay alguna razón específica por la que no estés usando Taps? , http://rubydoc.info/gems/taps/0.3.24/frames? Le permite ejecutar un simple 'heroku db: pull' para poblar una base de datos local. No estoy seguro si esto eliminaría su problema, pero es un poco más conveniente :) – theIV

+0

En realidad, tiene razón. Grifo de grifos instalado y ahora funciona perfectamente. Por alguna razón, la gema de grifos aún requiere declarar ambos grifos y sqlite3 en el archivo gema incluso si estoy usando un postgresql. ¿Quieres probar el tuyo como respuesta? – Martin

+0

Hecho y hecho. Acerca de los requisitos de gemas, sí, es un poco molesto la necesidad de declarar esos requisitos, incluso si está utilizando PG. :/ – theIV

Respuesta

51

Usted ve errores porque psql intenta interpretar consultas SQL cuando en realidad le está dando un compressed dump (eso es lo que heroku usa).

Aunque no se puede leer el volcado, pg_restore -O latest.dump le da SQL válida que podría tubería a psql pero la solución fácil es la siguiente:

pg_restore -O -d app_development latest.dump 

Notas:

  • Use -O porque probablemente no uses el nombre de usuario aleatorio de tu heroku remoto db postgres.
  • Heroku doesn't recommend to use taps pero no sé qué tan arriesgado es.
+0

Interesante. No había visto que * no * recomiendan usarlo, ya que lo desarrollaron y se usa internamente a través de la CLI. – theIV

+0

¿En qué parte del documento ve que Heroku no recomienda Taps? –

+0

Ese fue el caso cuando respondí esta pregunta: http://web.archive.org/web/20120310004826/http://devcenter.heroku.com/articles/taps –

3

Utilice la gema Taps. Le permite ejecutar un simple heroku db:pull para completar una base de datos local.

32

Siga estos 4 pasos simples en su terminal
(Heroku Dev Center):

  1. Crear una copia de seguridad de su base de datos:

    $ heroku pg:backups capture DATABASE_NAME 
    
  2. descargar la copia de Heroku (a su máquina local) usando curl:

    $ curl -o latest.dump 'heroku pg:backups public-url' 
    
  3. carga él *:

    $ pg_restore --verbose --clean --no-acl --no-owner -h localhost -U YOUR_USERNAME -d DATABASE_NAME latest.dump 
    
    • obtener su_nombre_de_usuario y elegir la base de datos deseada de su archivo config/database.yml.
    • DATABASE_NAME puede ser su desarrollo/prueba/producción db (Ej.mydb_development)

eso es todo!

+3

¡buenos pasos, probé y funciona! – abhijit

+1

nueva interfaz es: 'heroku pgbackups: captura' y luego ' curl -o latest.dump \ 'heroku pg: backups public-url \' ' – grosser

+0

Gracias @grosser, actualicé a la nueva interfaz. –

0

Quería evitar tener que configurar Postgres en mi máquina local (soplar y volver a crear la base de datos es complicado si solo está buscando instrucciones rápidas). Junté algunas instrucciones exactas para hacer esto con una base de datos local de Postgres ejecutando Docker. Estoy agregando un enlace aquí, ya que Google me siguió llevando a esta pregunta (y es una posible solución, aunque probablemente no sea lo que estás buscando): https://gist.github.com/locofocos/badd43131f14b3e40c760741d5a26471

Cuestiones relacionadas