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?


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ę


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 ).


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ć.


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


5

W systemie Windows użytkownicy próbują

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

Działa jak marzenie


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


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.