2014-04-05 12 views
23

A causa di incompatibilità della versione del mio database postgres su heroku (9.1) e la mia installazione locale (8.4) ho bisogno di un file di dump del database sql in modo da poter mettere una copia dei miei dati di produzione sul mio ambiente di test locale.Come posso ottenere un dump di database postgres in testo semplice su heroku?

Sembra su Heroku Non è possibile effettuare una discarica utilizzando pg_dump ma posso invece fare solo questo:

$ heroku pgbackups:capture 
$ curl -o my_dump_file.dump `heroku pgbackups:url` 

... e questo mi dà il "formato di dump del database personalizzato" e non "solo testo formato "quindi non sono in grado di farlo:

$ psql -d my_local_database -f my_dump_file.sql 

risposta

40

Si può semplicemente creare il proprio pg_dump direttamente dal database Heroku.

In primo luogo, ottenere la stringa postgres utilizzando heroku config:get DATABASE_URL.

Cercare l'URL Heroku Postgres (esempio: HEROKU_POSTGRESQL_RED_URL: postgres://user3123:[email protected]:6212/db982398), il cui formato è postgres://<username>:<password>@<host_name>:<port>/<dbname>.

successivo, eseguire questo sulla linea di comando:

pg_dump --host=<host_name> --port=<port> --username=<username> --password --dbname=<dbname> > output.sql 

Il terminale vi chiederà la password quindi eseguirlo e discarica in output.sql.

quindi importarlo:

psql -d my_local_database -f output.sql 
+2

Un altro modo: 1) 'pgbackups Heroku: capture' 2) copiare questo negli appunti:' pgbackups Heroku: url' 3) 'ricciolo -o latest.dump ' –

+0

Il la limitazione di 'heroku pgbackups' è che non funzionerà senza l'autenticazione dell'utente, nemmeno su Heroku all'interno dell'app. Sembra che pg_dump venga eseguito solo con l'autorizzazione del database. –

+2

heroku config: mi ha dato l'errore "Argomento mancante: KEY", ma solo la configurazione di heroku ha fornito le informazioni sull'URL – Straff

8

PGBackups di Heroku actually uses pg_dump behind the scenes, e il "formato personalizzato" è in realtà pg_dump's custom format (-Fc parameter), non proprio formato personalizzato di Heroku.

Questo significa che è possibile utilizzare pg_restore, che fa parte del Postgres, per ripristinare il backup di Heroku in un altro database direttamente:

pg_restore -d mydatabase my_dump_file.dump 

Inoltre, if you call pg_restore without specifying a database to restore to, it'll print SQL statements to standard out, in modo da poter trasformare il backup Heroku in un file SQL in questo modo:

pg_restore my_dump_file.dump > sql_statements.sql 
+2

Questa risposta dovrebbe essere quella giusta. L'uso di 'pg_restore my_dump_file.dump' ti fornirà istruzioni SQL in testo semplice. Grazie Adam! –

3

Supponendo di avere un DATABASE_URL configurato nel proprio ambiente, v'è un metodo molto più semplice:

heroku run 'pg_dump $DATABASE_URL' > my_database.sql 

Questo eseguirà pg_dump nel contenitore e reindirizzerà il contenuto a un file locale, my_database.sql. Le virgolette singole sono importanti. Se si utilizzano virgolette doppie (o nessuna virgolette), DATABASE_URL verrà valutato localmente anziché nel contenitore.

Se tutto il vostro scopo è quello di caricare il contenuto in un database locale in ogni modo, si potrebbe anche tubo dritto lì:

createdb myapp_devel # start with an empty database 
heroku run 'pg_dump -xO $DATABASE_URL' | psql myapp_devel 

L'aggiunta di -xO evita il dumping GRANT, REVOKE, e ALTER OWNER affermazioni, che probabilmente non si applicano al tuo server di database locale. Se uno dei tuoi comandi COPY fallisce con l'errore ERROR: literal carriage return found in data (il mio), vedi this answer.

È possibile che questo non abbia funzionato due anni e mezzo fa, quando inizialmente veniva posta questa domanda, ma per coloro che cercano un modo per ottenere facilmente una copia del database Heroku Postgres, questo sembra essere il più semplice possibile modo per farlo oggi.

Problemi correlati