pg_dump e pg_restore: il file di input non sembra essere un archivio valido


66

Ho usato pg_dump su una macchina e copiato il file dei risultati su un altro, dove ho provato a ripristinarlo. Credo che lo schema sia lo stesso. Tuttavia, ottengo:

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

Ho fatto le seguenti operazioni:

pg_dump -a -f db.txt dbname

e:

pg_restore -a -d dbname db.txt

Cosa potrebbe esserci di sbagliato?


Prova a importare il dump sullo stesso computer che lo ha generato. Inoltre, controlla le versioni di Postgres.
Hank Gay,

Non riesco a provare a importarlo sulla stessa macchina, perché è una macchina di produzione. Qualche idea, cos'altro posso fare?
gruszczy,

Questa soluzione può anche essere rilevante per alcune persone: stackoverflow.com/questions/42433414/…
Muhammad Hannan

Risposte:


93

Stai scaricando in formato sql semplice che è stato progettato per essere alimentato a psql. Questo non è riconosciuto da pg_restore.

cat db.txt | psql dbname

dovrebbe fare il trucco


5
oppure psql dbname < db.txt;)
Aleksey Deryagin il

26

pg_dumpper impostazione predefinita crea i comandi sql necessari per ricreare i dati. Per recuperarlo, devi solo invocare psql(non pg_restore) il file come input. pg_restoredeve essere utilizzato solo per il formato binario (non predefinito e meno usuale non raccomandato ) di pg_dump. Leggi i documenti .

Aggiornamento: i pg_dumpformati binari ( -Fc -Ft) che devono essere utilizzati pg_restoresono ok e offrono una maggiore flessibilità. Ma sono meno standard (non SQL), meno adatti per l'importazione da alcuni strumenti (ad esempio un frontend php) o manipolano con un editor di testo e un po 'meno portabili su altre versioni e persino su altri database. Per i backup, rimarrei con il formato normale predefinito. Per altri scenari, l'opzione binaria + pg_restore può essere uguale o più adatta.

Il punto da tenere è che in Postgresql, nello scenario tipico , il backup viene normalmente eseguito da pg_dump (plain) e il ripristino con il client della riga di comando standard ( psql ).


2
[OT] Mi permetto di differire per quanto riguarda lo stato "non raccomandato" del formato di output personalizzato - la frase "Questo è il formato più flessibile in quanto consente il riordino del caricamento dei dati e delle definizioni degli oggetti ..." dal manuale sembra per me come una vera approvazione.
Milen A. Radev,

"sconsigliato" è stata un'esagerazione, sono d'accordo. Ma "più flessibile" non significa necessariamente "più raccomandato". Chiarito.
leonbloy,

13

Prova a passare l' --format=copzione a pg_dump. Ciò consentirà pg_restoredi ripristinarlo.


Chiunque lo modifichi vorrebbe spiegare perché? La risposta accettata spiega che questo funzionerà :-)

@skrafi: qual è il tuo punto?
psmears,

1
scusa, output errato copiato e incollato, quello giusto è pg_restore: [archiver] did not find magic string in file headerquindi non funziona per il semplice dump sql
skrafi

@skrafi: non sono sicuro di cosa intendi. Se usi pg_dump --format=c ...> archivefile, e poi usi pg_restoresu archivefile, allora (almeno quando l'ho provato proprio ora) funziona benissimo. Forse il tuo file è corrotto in qualche modo? O hai riscontrato un bug particolare?
psmears,

6

Questo è ciò che farei per eseguire il backup del mio vecchio database e ripristinarlo

Per eseguire il backup del database

pg_dump --format=c olddb_name > db_dump_file.dump

Per ripristinare quel backup

pg_restore -v -d newdb_name db_dump_file.dump

Ulteriori informazioni su pg_dump e pg_restore


5

Per gli utenti di Windows provare

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

Funziona come un fascino


Questo mi ha salvato grazie! Dovrebbe essere accettata la risposta almeno per Windows.
Daniel Butler,

2

Puoi fare qualcosa al SOURCEcomando di MySQL :

psql dbname

Quindi, nel terminale postgresql:

\i filename


1

Questo messaggio di errore potrebbe anche significare che in realtà c'è qualcosa di sbagliato nel file di backup (o le tue ipotesi al riguardo).

In un caso, avevo montato un file di backup in un contenitore Docker e ho provato a ripristinare, ma non ci sono riuscito does not appear to be a valid archive. E infatti, il file era vuoto, perché il montaggio non è stato eseguito correttamente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.