ทำไม pg_restore ไม่สนใจ - สร้าง? ข้อผิดพลาด: ล้มเหลว: FATAL: ฐานข้อมูล“ new_db” ไม่มีอยู่


16

ฉันพยายามเรียกใช้คำสั่งต่อไปนี้:

sshpass  -p "pass" ssh  x@1.2.3.4 "pg_dump -Fc -U foo some_db" | pg_restore --create --dbname=new_db

ฉันเข้าใจ:

failed: FATAL:  database "new_db" does not exist

คำตอบ:


19

นี่เป็นเพราะมันเป็นวิธีที่ pg_restore ทำงาน

คู่มือ pg_restoreอ่านดังนี้:

-C, - สร้างสร้างฐานข้อมูลก่อนที่จะกู้คืนมัน หาก --clean ถูกระบุด้วยให้ดร็อปและสร้างฐานข้อมูลเป้าหมายอีกครั้งก่อนเชื่อมต่อ

เมื่อใช้ตัวเลือกนี้ฐานข้อมูลที่มีเครื่องหมาย -d จะใช้เพื่อออกคำสั่ง DROP DATABASE และคำสั่ง CREATE DATABASE เริ่มต้นเท่านั้น ข้อมูลทั้งหมดจะถูกเรียกคืนเข้าชื่อฐานข้อมูลที่ปรากฏในการเก็บ

-d จะคืนค่าในฐานข้อมูลที่กำหนดหากไม่ได้ใช้ -C หากใช้ -C ระบบจะใช้ฐานข้อมูลเป็น "launchpad" ไม่ใช่ปลายทาง


6
ชี้แจง: pg_restoreมีวิธีที่จะสร้างชื่อฐานข้อมูลโดยพลการและเรียกคืนเป็นมันไม่มี อ็อพชัน -C สามารถสร้างฐานข้อมูลที่มีชื่อตรงกับชื่อฐานข้อมูลในไฟล์ดัมพ์ เพื่อเรียกคืนไปยังฐานข้อมูลโดยพลการที่คุณต้องใช้CREATE DATABASE new_db;ใน psql pg_restore --dbname=new_dbก่อนที่คุณเรียก
ลุค

คำสั่งของฉันdocker-compose -p dump_import -f docker/dump_import.yml run --rm be bash -c 'waitforit -host=postgres -port=5432 -timeout=30 && export PGPASSWORD=$DATABASE_PASSWORD && createdb --echo --port=$DATABASE_PORT -host=$DATABASE_HOST --username=$DATABASE_USER $DATABASE_NAME && pg_restore --format=c --dbname=$DATABASE_URL_WITHOUT_QUERY tmp/full.dump && echo "Import done"'
srghma

5
ทำไมเครื่องมือต้องสร้างความสับสนเมื่อสามารถทำได้ง่าย
Augustin Riedinger

8

ในระยะสั้นคุณต้องการ (ทำความสะอาดที่มีอยู่): (โปรดทราบว่าชื่อฐานข้อมูลpostgres)

pg_restore -c -d postgres db.dump

หรือ (สร้างใหม่)

pg_restore -C -d postgres db.dump

หรือ (สร้างใหม่อย่างชัดเจน)

createdatabase the_database
pg_restore -d the_database db.dump

ดูสิ่งที่ SCO พูดเพื่อดูรายละเอียดเพิ่มเติม


ข้อเสนอแนะแรกของคุณไม่ทำงานใน 9.1:pg_restore: [archiver] -C and -c are incompatible options
peetasan

ฉันสามารถยืนยันได้ว่างานนี้ (หลังจากการแก้ไขและหลังจากแก้ไขการสะกดคำผิดของ "postgres") pg_restore -C -d postgres db.dumpอาจดูน่ากลัว แต่ไม่ทำอะไรเลยกับฐานข้อมูล postgres มันใช้สำหรับการเชื่อมต่อครั้งแรกเท่านั้น
Zilk

0

เพื่อให้ชัดเจนยิ่งขึ้นนี่คือสิ่งที่ฉันทำเพื่อแก้ไขปัญหาสำหรับฉัน:

  1. สร้างฐานข้อมูลเปล่าด้วยชื่อที่คุณต้องการ: (ในกรณีของฉันชื่อผู้ใช้คือ 'postgres')

    psql -U [username]

จากนั้นจะแจ้งให้คุณใส่รหัสผ่าน ถึงตอนนี้คุณจะเข้าสู่ระบบในชื่อ [ชื่อผู้ใช้] พิมพ์ต่อไปนี้:

    CREATE DATABASE [dbname];

ตอนนี้ออกจากเซสชันและกลับไปที่เซสชันเทอร์มินัลปกติของคุณ

  1. กู้คืนฐานข้อมูลจากไฟล์ที่คุณตั้งชื่อฐานข้อมูลเป้าหมายเป็นชื่อฐานข้อมูลที่คุณเพิ่งสร้างขึ้น

    cat [your_file_path/filename] | psql -U [username] [dbname]

โดยที่ [your_file_path / filename] เป็นที่ตั้งของไฟล์ db หรือไฟล์ข้อความที่คุณต้องการกู้คืน


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