pg_dump และ pg_restore: ไฟล์อินพุตไม่เป็นไฟล์เก็บถาวรที่ถูกต้อง


66

ฉันใช้ pg_dump กับเครื่องหนึ่งและคัดลอกไฟล์ผลลัพธ์ไปยังอีกเครื่องหนึ่งซึ่งฉันพยายามกู้คืน ฉันเชื่อว่าสคีมาเหมือนกัน อย่างไรก็ตามฉันได้รับ:

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

ฉันได้ดำเนินการต่อไปนี้แล้ว:

pg_dump -a -f db.txt dbname

และ:

pg_restore -a -d dbname db.txt

มีอะไรผิดปกติ?


ลองนำเข้าดัมพ์บนเครื่องเดียวกับที่สร้างขึ้น ตรวจสอบรุ่นของ Postgres ด้วย
แฮงค์ Gay

ฉันไม่สามารถลองนำเข้าได้ในเครื่องเดียวกันเพราะเป็นเครื่องที่ใช้งานจริง ความคิดใดที่ฉันสามารถทำได้อีก
gruszczy

วิธีนี้อาจเกี่ยวข้องกับบางคนเช่น: stackoverflow.com/questions/42433414/ …
Muhammad Hannan

คำตอบ:


93

คุณกำลังดัมพ์ในรูปแบบ sql ธรรมดาซึ่งออกแบบมาเพื่อฟีดให้กับ psql pg_restore ไม่รู้จัก

cat db.txt | psql dbname

ควรทำเคล็ดลับ


5
หรือpsql dbname < db.txt;)
Aleksey Deryagin

26

pg_dumpโดยค่าเริ่มต้นจะสร้างคำสั่ง sql ที่จำเป็นในการสร้างข้อมูลใหม่ ในการกู้คืนคุณจะต้องเรียกใช้psql(ไม่ใช่pg_restore) ด้วยไฟล์เป็นอินพุต pg_restoreเป็นเพียงที่จะใช้สำหรับไบนารี (ไม่เริ่มต้นและปกติน้อยไม่แนะนำ ) pg_dumpรูปแบบของ อ่านเอกสาร

อัปเดต: pg_dumpรูปแบบไบนารี ( -Fc -Ft) ที่จะใช้กับpg_restoreใช้ได้และมีความยืดหยุ่นเป็นพิเศษ แต่มีมาตรฐานน้อยกว่า (ไม่ใช่ SQL), มีแนวโน้มน้อยกว่าสำหรับการนำเข้าจากเครื่องมือบางอย่าง (เช่นส่วนหน้าของ php) หรือจัดการกับตัวแก้ไขข้อความและพกพาได้น้อยลงไปยังรุ่นอื่น ๆ และแม้แต่ฐานข้อมูลอื่น ๆ สำหรับการสำรองข้อมูลฉันจะใช้รูปแบบธรรมดาที่เป็นค่าเริ่มต้น สำหรับสถานการณ์อื่น ๆ ตัวเลือกไบนารี + pg_restore สามารถทำได้อย่างเท่าเทียมกันหรือมากกว่า

จุดที่ต้องเก็บคือใน Postgresql ในสถานการณ์ทั่วไปการสำรองข้อมูลโดยปกติจะทำโดยpg_dump (ธรรมดา) และการกู้คืนด้วยไคลเอ็นต์บรรทัดคำสั่งมาตรฐาน ( psql )


2
[OT] ฉันขอแตกต่างเกี่ยวกับสถานะ "ไม่แนะนำ" ของรูปแบบเอาต์พุตที่กำหนดเอง - ประโยค "นี่เป็นรูปแบบที่ยืดหยุ่นที่สุดในการอนุญาตให้เรียงลำดับข้อมูลการโหลดรวมถึงคำจำกัดความของวัตถุ ... " จากคู่มือ สำหรับฉันเป็นการรับรอง
Milen A. Radev

"ไม่แนะนำ" เป็นเรื่องเกินจริงฉันเห็นด้วย แต่ "ยืดหยุ่นที่สุด" ไม่ได้แปลว่า "แนะนำมากที่สุด" ชี้แจง
leonbloy

13

ลองผ่านตัวเลือกในการ--format=c pg_dumpสิ่งนี้จะช่วยให้pg_restoreสามารถเรียกคืนได้


ใครจะดัดแปลงสิ่งนี้ลงเพื่ออธิบายว่าทำไม? คำตอบที่ได้รับการยอมรับอธิบายว่าสิ่งนี้จะใช้ได้ :-)

@skrafi: ประเด็นของคุณคืออะไร?
psmears

1
ขออภัยเอาต์พุตที่คัดลอกผิดวางถูกต้องpg_restore: [archiver] did not find magic string in file headerดังนั้นนี่ไม่ได้ผลสำหรับการถ่ายโอนข้อมูล SQL อย่างง่าย
skrafi

@skrafi: ฉันไม่แน่ใจว่าคุณหมายถึงอะไร ถ้าคุณใช้pg_dump --format=c ...> archivefileแล้วใช้pg_restoreบนarchivefile(อย่างน้อยตอนที่ฉันทดสอบตอนนี้) มันใช้งานได้ดี อาจเป็นไฟล์ของคุณเสียหายอย่างใด? หรือคุณมีข้อผิดพลาดโดยเฉพาะอย่างยิ่ง?
psmears

6

นี่คือสิ่งที่ฉันจะทำเพื่อสำรองฐานข้อมูลเก่าของฉันและเรียกคืน

เพื่อสำรองฐานข้อมูลของคุณ

pg_dump --format=c olddb_name > db_dump_file.dump

เพื่อเรียกคืนข้อมูลสำรองนั้น

pg_restore -v -d newdb_name db_dump_file.dump

อ่านเพิ่มเติมเกี่ยวกับpg_dumpและpg_restore


5

สำหรับผู้ใช้ windows ลอง

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

ทำงานเหมือนจับใจ


สิ่งนี้ช่วยฉันขอบคุณ! ควรยอมรับคำตอบสำหรับ windows อย่างน้อย
Daniel Butler

2

คุณสามารถทำอะไรกับSOURCEคำสั่งของ MySQL :

psql dbname

จากนั้นในเทอร์มินัล postgresql:

\i filename

2

cat dumpFileName | psql -h ip -d dbName -U ชื่อผู้ใช้ -W


1
โดยปกติแล้วจะมีประโยชน์หากคุณอธิบายสิ่งที่ทำและสาเหตุที่อาจช่วยได้
Falcon Momot

1

ข้อความแสดงข้อผิดพลาดนี้อาจหมายความว่ามีบางอย่างผิดปกติกับไฟล์สำรองข้อมูล (หรือสมมุติว่าคุณมีข้อมูลสำรอง)

ในกรณีหนึ่งที่ผมได้ติดตั้งไฟล์สำรองในภาชนะหางและพยายามที่จะเรียกคืน does not appear to be a valid archiveแต่ก็ล้มเหลวด้วย และในความเป็นจริงไฟล์นั้นว่างเปล่าเนื่องจากการเมานต์นั้นไม่ได้ทำงานอย่างถูกต้อง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.