pg_dump i pg_restore: plik wejściowy nie wydaje się być prawidłowym archiwum

66

Użyłem pg_dump na jednym komputerze i skopiowałem plik wynikowy na inny, gdzie próbowałem go przywrócić. Uważam, że schemat jest taki sam. Dostaję jednak:

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

Wykonałem następujące operacje:

pg_dump -a -f db.txt dbname

i:

pg_restore -a -d dbname db.txt

Co może być nie tak?

gruszczy
źródło
Spróbuj zaimportować zrzut na tym samym komputerze, który go wygenerował. Sprawdź także wersje Postgres.
Hank Gay
Nie mogę spróbować zaimportować go na tym samym komputerze, ponieważ jest to maszyna produkcyjna. Masz pomysł, co jeszcze mogę zrobić?
gruszczy
To rozwiązanie może być również przydatne dla niektórych osób: stackoverflow.com/questions/42433414/…
Muhammad Hannan

Odpowiedzi:

93

Wysypujesz w formacie zwykłego sql, który został zaprojektowany do przesyłania do psql. Pg_restore nie rozpoznaje tego.

cat db.txt | psql dbname

powinien załatwić sprawę

Peter Tillemans
źródło
5
lub psql dbname < db.txt;)
Aleksey Deryagin
26

pg_dumpdomyślnie tworzy polecenia sql niezbędne do odtworzenia danych. Aby go odzyskać, wystarczy wywołać psql(nie pg_restore) plik z danymi wejściowymi. pg_restorejest używany tylko w formacie binarnym (nie jest to domyślny i rzadziej nie zalecany ) format pg_dump. Przeczytaj dokumenty .

Aktualizacja: pg_dumpFormaty binarne ( -Fc -Ft), które mają być używane, pg_restoresą w porządku i oferują dodatkową elastyczność. Są jednak mniej standardowe (nie SQL), mniej skłonne do importowania z niektórych narzędzi (np. Nakładki php) lub manipulowania za pomocą edytora tekstowego, i nieco mniej przenośne do innych wersji, a nawet innych baz danych. W przypadku kopii zapasowych trzymałbym się domyślnego zwykłego formatu. W innych scenariuszach opcja binarna + pg_restore może być jednakowo lub bardziej trafna.

Należy zachować ostrożność, ponieważ w Postgresql, w typowym scenariuszu , tworzenie kopii zapasowej zwykle odbywa się za pomocą pg_dump (zwykły) i przywracania za pomocą standardowego klienta wiersza poleceń ( psql ).

leonbloy
źródło
2
[OT] Zaczynam się różnić co do statusu „niezalecanego” niestandardowego formatu wyjściowego - wydaje się zdanie „Jest to najbardziej elastyczny format, ponieważ umożliwia zmianę kolejności ładowania danych, a także definicji obiektów ...” z podręcznika dla mnie jako całkiem aprobata.
Milen A. Radev,
Zgadzam się, że „niezalecane” było przesadą. Ale „najbardziej elastyczny” niekoniecznie oznacza „najbardziej zalecany”. Wyjaśnione.
leonbloy
13

Spróbuj przekazać tę --format=copcję do pg_dump. Pozwoli pg_restoreto go przywrócić.

psmears
źródło
Czy ktokolwiek to zmienił, chciałby wyjaśnić, dlaczego? Przyjęta odpowiedź wyjaśnia, że ​​to zadziała :-)
@skrafi: O co ci chodzi?
psmears,
1
przepraszam, źle pg_restore: [archiver] did not find magic string in file header
wkleiłem
@skrafi: Nie jestem pewien, co masz na myśli. Jeśli użyjesz pg_dump --format=c ...> archivefile, a następnie użyjesz pg_restoredalej archivefile, to (przynajmniej kiedy właśnie to przetestowałem) działa dobrze. Może twój plik jest jakoś uszkodzony? A może trafiłeś konkretny błąd?
psmears
6

To właśnie zrobiłbym, aby wykonać kopię zapasową mojej starej bazy danych i przywrócić

Aby wykonać kopię zapasową bazy danych

pg_dump --format=c olddb_name > db_dump_file.dump

Aby przywrócić tę kopię zapasową

pg_restore -v -d newdb_name db_dump_file.dump

Przeczytaj więcej na pg_dump i pg_restore

Techie
źródło
5

W systemie Windows użytkownicy próbują

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

Działa jak marzenie


źródło
To mnie uratowało, dziękuję! Należy zaakceptować odpowiedź przynajmniej dla systemu Windows.
Daniel Butler,
2

Możesz zrobić coś na SOURCEpolecenie MySQL :

psql dbname

Następnie w terminalu postgresql:

\i filename
greg0ire
źródło
2

cat dumpFileName | psql -h ip -d nazwa_db -U nazwa_użytkownika -W

Mayank Raipure
źródło
1
Jest to zwykle pomocne, jeśli wyjaśnisz, co to robi i dlaczego może pomóc.
Falcon Momot,
1

Ten komunikat o błędzie może również oznaczać, że coś jest nie tak z plikiem kopii zapasowej (lub twoimi założeniami na ten temat).

W jednym przypadku zamontowałem plik kopii zapasowej w kontenerze Docker i próbowałem przywrócić, ale nie udało się does not appear to be a valid archive. W rzeczywistości plik był pusty, ponieważ podłączenie nie zostało wykonane poprawnie.

Dag Høidahl
źródło