pg_dump y pg_restore: el archivo de entrada no parece ser un archivo válido

66

Utilicé pg_dump en una máquina y copié el archivo de resultados en otra, donde intenté restaurarlo. Creo que el esquema es el mismo. Sin embargo, me sale:

pg_restore: [archiver] input file does not appear to be a valid archive

He realizado las siguientes operaciones:

pg_dump -a -f db.txt dbname

y:

pg_restore -a -d dbname db.txt

¿Qué puede estar mal?

gruszczy
fuente
Intente importar el volcado en la misma máquina que lo generó. Además, verifique las versiones de Postgres.
Hank Gay
No puedo intentar importarlo en la misma máquina, porque es una máquina de producción. Alguna idea, ¿qué más puedo hacer?
gruszczy
Esta solución también puede ser relevante para algunas personas: stackoverflow.com/questions/42433414/…
Muhammad Hannan

Respuestas:

93

Está volcando en formato sql simple que fue diseñado para alimentar a psql. Esto no es reconocido por pg_restore.

cat db.txt | psql dbname

debería hacer el truco

Peter Tillemans
fuente
55
o psql dbname < db.txt;)
Aleksey Deryagin
26

pg_dumppor defecto crea los comandos sql necesarios para recrear los datos. Para recuperarlo, solo necesita invocar psql(no pg_restore) con el archivo como entrada. pg_restoresolo se debe utilizar para el formato binario (no predeterminado y menos habitual no recomendado ) de pg_dump. Lee los documentos .

Actualización: pg_dumplos formatos binarios ( -Fc -Ft) que se utilizarán pg_restoreestán bien y ofrecen cierta flexibilidad adicional. Pero son menos estándar (no SQL), menos aptos para importar desde algunas herramientas (por ejemplo, una interfaz php) o manipularse con un editor de texto, y un poco menos portátiles para otras versiones e incluso otras bases de datos. Para las copias de seguridad, me quedaría con el formato plano predeterminado. Para otros escenarios, la opción binary + pg_restore puede ser igual o más adecuada.

El punto a tener en cuenta es que en Postgresql, en el escenario típico , la copia de seguridad normalmente se realiza mediante pg_dump (plain) y la restauración con el cliente de línea de comando estándar ( psql ).

leonbloy
fuente
2
[OT] Ruego diferir con respecto al estado "no recomendado" del formato de salida personalizado: parece ser la frase "Este es el formato más flexible, ya que permite reordenar los datos de carga, así como las definiciones de objetos ..." del manual para mí como un gran respaldo.
Milen A. Radev
"no recomendado" fue una exageración, estoy de acuerdo. Pero "más flexible" no significa necesariamente "más recomendado". Aclarado
leonbloy
13

Intenta pasar la --format=copción a pg_dump. Esto permitirá pg_restorerestaurarlo.

psmears
fuente
¿Quien modificó esto quiere explicar por qué? La respuesta aceptada explica que esto funcionará :-)
@skrafi: ¿Cuál es tu punto?
psmears
1
lo siento, copia incorrecta de salida incorrecta, la correcta es pg_restore: [archiver] did not find magic string in file headerpara que esto no funcione para un simple volcado de sql
skrafi
@skrafi: No estoy seguro de lo que quieres decir. Si se utiliza pg_dump --format=c ...> archivefile, y luego usar pg_restoreen archivefile, entonces (al menos cuando lo probé hace un momento) que trabaja muy bien. Tal vez su archivo está dañado de alguna manera? ¿O has golpeado un error en particular?
psmears
6

Esto es lo que haría para hacer una copia de seguridad de mi base de datos anterior y restaurar

Para hacer una copia de seguridad de su base de datos

pg_dump --format=c olddb_name > db_dump_file.dump

Para restaurar esa copia de seguridad

pg_restore -v -d newdb_name db_dump_file.dump

Lea más sobre pg_dump y pg_restore

Techie
fuente
5

Para usuarios de Windows intente

type db.txt | psql --username="YOURNAME" dbname

Funciona de maravilla


fuente
Esto me salvó gracias! Se debe aceptar la respuesta para Windows al menos.
Daniel Butler
2

Puede hacer algo al SOURCEcomando de MySQL :

psql dbname

Luego, en la terminal postgresql:

\i filename
greg0ire
fuente
2

cat dumpFileName | psql -h ip -d dbName -U nombre de usuario -W

Raipure Mayank
fuente
1
Por lo general, es útil si explica lo que hace y por qué podría ayudar.
Falcon Momot
1

Este mensaje de error también podría significar que realmente hay algo mal con el archivo de respaldo (o sus suposiciones al respecto).

En un caso, había montado un archivo de copia de seguridad en un contenedor Docker e intenté restaurarlo, pero falló does not appear to be a valid archive. Y, de hecho, el archivo estaba vacío, porque el montaje no se realizó correctamente.

Dag Høidahl
fuente