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.