ฉันใช้ pg_dump / pg_restore เพื่อสำรองและกู้คืนฐานข้อมูล PostgreSQL แต่ฉันได้รับข้อความแสดงข้อผิดพลาด (และสถานะทางออกที่ไม่เป็นศูนย์) จาก pg_restore ฉันลองใช้เคสพื้นฐานแบบง่าย ๆ (อธิบายไว้ด้านล่าง) แต่ยังมีข้อผิดพลาดเหล่านี้:
pg_restore: [archiver (db)] ข้อผิดพลาดขณะประมวลผล TOC: pg_restore: [archiver (db)] ข้อผิดพลาดจากรายการ TOC 5; 2615 2200 SCHEMA postgres สาธารณะ pg_restore: [archiver (db)] ไม่สามารถดำเนินการค้นหา: ข้อผิดพลาด: schema "สาธารณะ" มีอยู่แล้ว คำสั่งคือ: สร้างสาธารณะ SCHEMA;
ขั้นตอนในการทำซ้ำ:
- ติดตั้ง vanilla Ubuntu 14.04 distro สดใหม่ (ฉันใช้ Vagrant กับกล่อง Vagrant นี้ )
- ติดตั้ง PostgreSQL 9.3 กำหนดค่าเพื่ออนุญาตการเชื่อมต่อท้องถิ่นในฐานะผู้ใช้ PostgreSQL "postgres" จากผู้ใช้ Linux ใด ๆ
สร้างฐานข้อมูลทดสอบ ฉันแค่ทำ:
vagrant @ vagrant-ubuntu-trusty-64: ~ $ psql - ชื่อผู้ใช้ = postgres postgres psql (9.3.5) พิมพ์ "ความช่วยเหลือ" เพื่อขอความช่วยเหลือ postgres = # สร้างฐานข้อมูล mydb; สร้างฐานข้อมูล postgres = # \ q vagrant @ vagrant-ubuntu-trusty-64: ~ $ psql - ชื่อผู้ใช้ = postgres mydb psql (9.3.5) พิมพ์ "ความช่วยเหลือ" เพื่อขอความช่วยเหลือ mydb = # create data table (entry bigint); สร้างตาราง mydb = # insert เป็นค่าข้อมูล (1); INSERT 0 1 mydb = # insert เป็นค่าข้อมูล (2); INSERT 0 1 mydb = # insert เป็นค่าข้อมูล (3); INSERT 0 1 mydb = # \ q
สร้างการสำรองข้อมูลของฐานข้อมูลดังนี้:
PGPASSWORD = "postgres" pg_dump --dbname = mydb --username = postgres --format = กำหนดเอง> pg_backup.dump
ลบบางแถวออกจากตารางข้อมูลใน mydb ดังนั้นเราจะสามารถบอกได้ว่าเรากู้คืนข้อมูลสำเร็จหรือไม่
กู้คืนฐานข้อมูลด้วย:
PGPASSWORD = "postgres" pg_restore - สะอาด - สร้าง - dbname = postgres - ชื่อผู้ใช้ = postgres pg_backup.dump
ข้อมูลถูกกู้คืน แต่คำสั่ง pg_restore ในขั้นตอนที่ 6 จบด้วยสถานะ1
และแสดงเอาต์พุตต่อไปนี้:
pg_restore: [archiver (db)] ข้อผิดพลาดขณะประมวลผล TOC: pg_restore: [archiver (db)] ข้อผิดพลาดจากรายการ TOC 5; 2615 2200 SCHEMA postgres สาธารณะ pg_restore: [archiver (db)] ไม่สามารถดำเนินการค้นหา: ข้อผิดพลาด: schema "สาธารณะ" มีอยู่แล้ว คำสั่งคือ: สร้างสาธารณะ SCHEMA; คำเตือน: ข้อผิดพลาดถูกละเว้นเมื่อกู้คืน: 1
ฉันไม่สามารถเพิกเฉยได้เพราะฉันใช้คำสั่งนี้โดยทางโปรแกรมและจำเป็นต้องใช้สถานะออกเพื่อตรวจสอบว่าการคืนค่าล้มเหลวหรือไม่ ตอนแรกฉันสงสัยว่าปัญหานี้เกิดขึ้นเพราะฉันใส่ฐานข้อมูลของฉันในที่สาธารณะ (schema เริ่มต้น) ฉันให้เหตุผลว่าสาธารณะจะถูกสร้างขึ้นเนื่องจาก--create
ตัวเลือกโดย pg_restore ก่อนที่ข้อมูลจะถูกกู้คืน (ซึ่งอาจลองสร้าง schema นั้นเช่นกันเนื่องจากเป็นที่ที่ตารางของฉันอยู่) แต่เมื่อฉันลองขั้นตอนข้างต้นกับตารางของฉัน ในสคีมาที่ต่างกันผลลัพธ์จะเหมือนกันและข้อความแสดงข้อผิดพลาดเหมือนกัน
ฉันกำลังทำอะไรผิดหรือเปล่า? เหตุใดฉันจึงเห็นข้อผิดพลาดนี้
--create
โดยclean
ไม่ได้แก้ไขปัญหา