ไฟล์อินพุตดูเหมือนจะเป็นการถ่ายโอนข้อมูลรูปแบบข้อความ กรุณาใช้ psql


95

ฉันสำรองข้อมูลโดยใช้ไฟล์

pg_dump db_production > postgres_db.dump

จากนั้นฉันคัดลอกไปยัง localhost โดยใช้ scp

ตอนนี้เมื่อฉันนำเข้าฐานข้อมูลในเครื่องของฉันมันทำให้เกิดข้อผิดพลาด

pg_restore: [archiver] input file appears to be a text format dump. Please use psql.

โดยใช้เส้นจุลภาค

pg_restore -d db_development postgres_db.dump

คำตอบ:


138

จากpg_dumpเอกสารประกอบ:

ตัวอย่าง

ในการถ่ายโอนฐานข้อมูลที่เรียกว่า mydb ลงในไฟล์สคริปต์ SQL :

$ pg_dump mydb > db.sql

ในการโหลดสคริปต์ดังกล่าวซ้ำลงในฐานข้อมูล (สร้างขึ้นใหม่) ชื่อ newdb :

$ psql -d newdb -f db.sql

ในการถ่ายโอนฐานข้อมูลลงในไฟล์เก็บถาวรรูปแบบกำหนดเอง:

$ pg_dump -Fc mydb > db.dump

ในการถ่ายโอนฐานข้อมูลลงในไฟล์เก็บถาวรรูปแบบไดเร็กทอรี:

$ pg_dump -Fd mydb -f dumpdir

ในการโหลดไฟล์เก็บถาวรใหม่ลงในฐานข้อมูล (สร้างใหม่) ชื่อ newdb:

$ pg_restore -d newdb db.dump

จากpg_restoreเอกสารประกอบ:

ตัวอย่าง

สมมติว่าเราได้ทิ้งฐานข้อมูลที่เรียกว่า mydb ลงในไฟล์ดัมพ์รูปแบบที่กำหนดเอง:

$ pg_dump -Fc mydb > db.dump

ในการวางฐานข้อมูลและสร้างใหม่จากการถ่ายโอนข้อมูล:

$ dropdb mydb
$ pg_restore -C -d postgres db.dump

2
เมื่อฉันทำ pg_restore ฉันได้รับไฟล์อินพุต pg_restore: [archiver] ดูเหมือนจะเป็นการถ่ายโอนข้อมูลรูปแบบข้อความ กรุณาใช้ psql
Haseeb Ahmad

ฉันใช้อันไหนในการกู้คืนฐานข้อมูล
Haseeb Ahmad

76
สิ่งนี้ไม่ตอบคำถาม
dopatraman

1
สำหรับวิธีการกู้คืนจากไฟล์ข้อความ checkout serverfault.com/questions/260607/…
chrs

7
IMO โพสต์นี้มีรายละเอียดมากเกินไปซึ่งทำให้คำตอบสับสน สิ่งที่ผู้เขียนไม่สามารถชี้ให้เห็นก็คือเอกสารคู่มือ pg_dump สำหรับพารามิเตอร์ '-F' ไม่ได้บอกว่ารูปแบบเริ่มต้น ('p' / 'plain') เหมาะสำหรับ pg_restore pg_restore กำหนดให้ใช้ pg_dump กับรูปแบบ 'c', 'd' หรือ 't'
Matt


14

สำหรับฉันเมื่อฉันพยายามกู้คืนจากโฮสต์ระยะไกลที่ฉันใช้

psql -U username -p 5432 -h 10.10.10.1 -d database < db.dump

ทำงานได้ดี และถ้าไม่ใช่รีโมตเพียงแค่ทำตามคำสั่งก็ใช้งานได้

psql -d database < db.dump

9

ในการสร้างข้อมูลสำรองโดยใช้pg_dumpที่เข้ากันได้pg_restoreคุณต้องใช้--format=custom/ -Fcเมื่อสร้างดัมพ์ของคุณ

จากเอกสาร:

เอาท์พุตไฟล์เก็บถาวรรูปแบบกำหนดเองที่เหมาะสำหรับอินพุตใน pg_restore

ดังนั้นpg_dumpคำสั่งของคุณอาจมีลักษณะดังนี้:

pg_dump --file /tmp/db.dump --format=custom --host localhost --dbname my-source-database --username my-username --password

และpg_restoreคำสั่งของคุณ:

pg_restore --verbose --clean --no-acl --no-owner --host localhost --dbname my-destination-database /tmp/db.dump

6

สำหรับฉันมันทำงานเหมือนอันนี้ C: \ Program Files \ PostgreSQL \ 12 \ bin> psql -U postgres -p 5432 -d dummy -f C: \ Users \ Downloads \ d2cm_test.sql


2
คำตอบที่ง่ายและเป็นประโยชน์!
Rax Weber

1
ขอบคุณ @RAJNISH YADAV
มิต

1

หากคุณใช้ pg_dump กับ -Fp เพื่อสำรองข้อมูลในรูปแบบข้อความธรรมดาให้ใช้คำสั่งต่อไปนี้:

cat db.txt | psql dbname

เพื่อคัดลอกข้อมูลทั้งหมดไปยังฐานข้อมูลของคุณด้วยชื่อ dbname


0

หากคุณมีดัมพ์ DB แบบเต็ม:

PGPASSWORD="your_pass" psql -h "your_host" -U "your_user" -d "your_database" -f backup.sql

อย่างไรก็ตามหากคุณเก็บสคีมาแยกกันจะใช้ไม่ได้ จากนั้นคุณจะต้องปิดการใช้งานทริกเกอร์สำหรับการแทรกข้อมูลคล้ายกับpg_restore --disable-triggersจากนั้นคุณจะต้องปิดการใช้งานทริกเกอร์สำหรับการแทรกข้อมูลที่คล้ายกับจากนั้นคุณสามารถใช้สิ่งนี้:

cat database_data_only.gzip | gunzip | PGPASSWORD="your_pass" psql -h "your_host" -U root "your_database" -c 'SET session_replication_role = replica;' -f /dev/stdin

ฉันคิดว่ามันเป็นข้อเสียที่โชคร้ายมากของ postgres วิธีการเริ่มต้นของการสร้างการถ่ายโอนข้อมูลในการไม่เข้ากันกับpg_dump pg_restoreอย่างไรก็ตามด้วยคีย์เพิ่มเติมบางอย่างก็คือ WTF?

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