ฉันพยายามเรียกใช้คำสั่งต่อไปนี้:
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
ฉันพยายามเรียกใช้คำสั่งต่อไปนี้:
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
คำตอบ:
นี่เป็นเพราะมันเป็นวิธีที่ pg_restore ทำงาน
คู่มือ pg_restoreอ่านดังนี้:
-C, - สร้างสร้างฐานข้อมูลก่อนที่จะกู้คืนมัน หาก --clean ถูกระบุด้วยให้ดร็อปและสร้างฐานข้อมูลเป้าหมายอีกครั้งก่อนเชื่อมต่อ
เมื่อใช้ตัวเลือกนี้ฐานข้อมูลที่มีเครื่องหมาย -d จะใช้เพื่อออกคำสั่ง DROP DATABASE และคำสั่ง CREATE DATABASE เริ่มต้นเท่านั้น ข้อมูลทั้งหมดจะถูกเรียกคืนเข้าชื่อฐานข้อมูลที่ปรากฏในการเก็บ
-d จะคืนค่าในฐานข้อมูลที่กำหนดหากไม่ได้ใช้ -C หากใช้ -C ระบบจะใช้ฐานข้อมูลเป็น "launchpad" ไม่ใช่ปลายทาง
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"'
ในระยะสั้นคุณต้องการ (ทำความสะอาดที่มีอยู่): (โปรดทราบว่าชื่อฐานข้อมูล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 พูดเพื่อดูรายละเอียดเพิ่มเติม
pg_restore: [archiver] -C and -c are incompatible options
pg_restore -C -d postgres db.dump
อาจดูน่ากลัว แต่ไม่ทำอะไรเลยกับฐานข้อมูล postgres มันใช้สำหรับการเชื่อมต่อครั้งแรกเท่านั้น
เพื่อให้ชัดเจนยิ่งขึ้นนี่คือสิ่งที่ฉันทำเพื่อแก้ไขปัญหาสำหรับฉัน:
สร้างฐานข้อมูลเปล่าด้วยชื่อที่คุณต้องการ: (ในกรณีของฉันชื่อผู้ใช้คือ 'postgres')
psql -U [username]
จากนั้นจะแจ้งให้คุณใส่รหัสผ่าน ถึงตอนนี้คุณจะเข้าสู่ระบบในชื่อ [ชื่อผู้ใช้] พิมพ์ต่อไปนี้:
CREATE DATABASE [dbname];
ตอนนี้ออกจากเซสชันและกลับไปที่เซสชันเทอร์มินัลปกติของคุณ
กู้คืนฐานข้อมูลจากไฟล์ที่คุณตั้งชื่อฐานข้อมูลเป้าหมายเป็นชื่อฐานข้อมูลที่คุณเพิ่งสร้างขึ้น
cat [your_file_path/filename] | psql -U [username] [dbname]
โดยที่ [your_file_path / filename] เป็นที่ตั้งของไฟล์ db หรือไฟล์ข้อความที่คุณต้องการกู้คืน
-F
ตัวเลือกde คุณต้องใช้ pg_restore เพื่อกู้คืนการสำรองข้อมูลเว้นแต่ว่าคุณใช้-F p
ซึ่งสร้างไฟล์ข้อความธรรมดาพร้อมประโยค sql
pg_restore
มีวิธีที่จะสร้างชื่อฐานข้อมูลโดยพลการและเรียกคืนเป็นมันไม่มี อ็อพชัน -C สามารถสร้างฐานข้อมูลที่มีชื่อตรงกับชื่อฐานข้อมูลในไฟล์ดัมพ์ เพื่อเรียกคืนไปยังฐานข้อมูลโดยพลการที่คุณต้องใช้CREATE DATABASE new_db;
ใน psqlpg_restore --dbname=new_db
ก่อนที่คุณเรียก