pg_dump dan pg_restore: file input tampaknya bukan arsip yang valid

66

Saya telah menggunakan pg_dump pada satu mesin dan menyalin file hasil ke yang lain, di mana saya mencoba mengembalikannya. Saya percaya skema itu sama. Namun, saya mendapatkan:

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

Saya telah melakukan operasi berikut:

pg_dump -a -f db.txt dbname

dan:

pg_restore -a -d dbname db.txt

Apa yang salah?

gruszczy
sumber
Coba impor dump pada mesin yang sama yang membuatnya. Juga, periksa versi Postgres.
Hank Gay
Saya tidak dapat mencoba mengimpornya di mesin yang sama, karena ini adalah mesin produksi. Ada ide, apa lagi yang bisa saya lakukan?
gruszczy
Solusi ini mungkin juga relevan bagi sebagian orang: stackoverflow.com/questions/42433414/...
Muhammad Hannan

Jawaban:

93

Anda membuang dalam format sql sederhana yang dirancang untuk memberi makan ke psql. Ini tidak dikenali oleh pg_restore.

cat db.txt | psql dbname

harus melakukan trik

Peter Tillemans
sumber
5
atau psql dbname < db.txt;)
Aleksey Deryagin
26

pg_dumpsecara default menciptakan perintah sql yang diperlukan untuk membuat ulang data. Untuk memulihkannya, Anda hanya perlu memohon psql(tidak pg_restore) dengan file sebagai input. pg_restorehanya digunakan untuk format biner (tidak default, dan kurang biasa tidak disarankan ) dari pg_dump. Baca dokumen .

Pembaruan: pg_dumpFormat biner ( -Fc -Ft) yang akan digunakan pg_restoreadalah ok, dan menawarkan fleksibilitas ekstra. Tetapi mereka kurang standar (non SQL), kurang tepat untuk mengimpor dari beberapa alat (misalnya frontend php) atau memanipulasi dengan editor teks, dan sedikit kurang portabel untuk versi lain dan bahkan database lain. Untuk cadangan, saya tetap menggunakan format polos standar. Untuk skenario lain, opsi binary + pg_restore bisa sama atau lebih tepat.

Yang perlu diperhatikan adalah bahwa dalam Postgresql, dalam skenario tipikal , pencadangan biasanya dilakukan oleh pg_dump (polos) dan pemulihan dengan klien baris perintah standar ( psql ).

leonbloy
sumber
2
[OT] Saya mohon berbeda tentang status "tidak direkomendasikan" dari format keluaran khusus - kalimat "Ini adalah format yang paling fleksibel karena memungkinkan pengubahan urutan pemuatan data serta definisi objek ..." dari manual tampaknya bagi saya sebagai dukungan.
Milen A. Radev
"tidak direkomendasikan" terlalu berlebihan, saya setuju. Tetapi "paling fleksibel" tidak selalu berarti "paling direkomendasikan". Diklarifikasi
leonbloy
13

Coba lewati --format=copsi untuk pg_dump. Ini akan memungkinkan pg_restoreuntuk mengembalikannya.

psmears
sumber
Apakah siapa pun yang mengecilkan ini ingin menjelaskan mengapa? Jawaban yang diterima menjelaskan bahwa ini akan berhasil :-)
@skrafi: Apa maksudmu?
psmears
1
maaf, salin-tempel output salah, yang benar pg_restore: [archiver] did not find magic string in file headerjadi ini tidak bekerja untuk dump sql sederhana
skrafi
@skrafi: Saya tidak yakin apa yang Anda maksud. Jika Anda menggunakan pg_dump --format=c ...> archivefile, dan kemudian menggunakan pg_restorepada archivefile, maka (setidaknya ketika saya diuji sekarang) bekerja dengan baik. Mungkin file Anda rusak entah bagaimana? Atau Anda telah menemukan bug tertentu?
psmears
6

Inilah yang akan saya lakukan untuk membuat cadangan basis data lama dan memulihkan

Untuk membuat cadangan basis data Anda

pg_dump --format=c olddb_name > db_dump_file.dump

Untuk memulihkan cadangan itu

pg_restore -v -d newdb_name db_dump_file.dump

Baca lebih lanjut tentang pg_dump dan pg_restore

Techie
sumber
5

Untuk pengguna windows coba

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

Bekerja seperti pesona


sumber
Ini menyelamatkan saya, terima kasih! Setidaknya harus diterima jawaban untuk windows.
Daniel Butler
2

Anda dapat melakukan sesuatu terhadap SOURCEperintah MySQL :

psql dbname

Kemudian, di terminal postgresql:

\i filename
greg0ire
sumber
2

cat dumpFileName | psql -h ip -d dbName -U nama pengguna -W

Mayank Raipure
sumber
1
Biasanya bermanfaat jika Anda menjelaskan apa yang dilakukannya dan mengapa itu bisa membantu.
Falcon Momot
1

Pesan kesalahan ini juga bisa berarti bahwa sebenarnya ada yang salah dengan file cadangan (atau asumsi Anda tentangnya).

Dalam satu kasus, saya telah memasang file cadangan di wadah Docker dan mencoba memulihkan, tetapi gagal dengan does not appear to be a valid archive. Dan faktanya, file itu kosong, karena mount tidak dilakukan dengan benar.

Dag Høidahl
sumber