ส่งออกและนำเข้าฐานข้อมูล PostgreSQL ด้วยชื่ออื่น?


39

มีวิธีการส่งออกฐานข้อมูล PostgreSQL และนำเข้าภายหลังด้วยชื่ออื่นหรือไม่?

ฉันใช้ PostgreSQL กับ Rails และฉันมักจะส่งออกข้อมูลจากการผลิตซึ่งฐานข้อมูลนั้นเรียกว่า blah_production และนำเข้ามาในการพัฒนาหรือการจัดเตรียมด้วยชื่อ blah_development และ blah_staging บน MySQL นี่เป็นเรื่องเล็กน้อยเนื่องจากการส่งออกไม่มีฐานข้อมูลที่ใดก็ได้ (ยกเว้นความเห็น) แต่บน PostgreSQL ดูเหมือนว่าจะเป็นไปไม่ได้ มันเป็นไปไม่ได้เหรอ?

ฉันกำลังทิ้งฐานข้อมูลด้วยวิธีนี้:

pg_dump blah > blah.dump

ฉันไม่ได้ใช้ตัวเลือก -c หรือ -C ดัมพ์นั้นมีคำสั่งเช่น:

COMMENT ON DATABASE blah IS 'blah';

ALTER TABLE public.checks OWNER TO blah;

ALTER TABLE public.users OWNER TO blah;

เมื่อฉันพยายามนำเข้าด้วย

psql blah_devel < blah.dump

ฉันเข้าใจ

WARNING:  database "blah" does not exist

ERROR:  role "blah" does not exist

บางทีปัญหาอาจไม่ใช่ฐานข้อมูล แต่เป็นบทบาทใช่หรือไม่

ถ้าฉันทิ้งแบบนี้:

pg_dump --format=c blah > blah.dump

และพยายามนำเข้าด้วยวิธีนี้:

pg_restore -d blah_devel < tmp/blah.psql

ฉันได้รับข้อผิดพลาดเหล่านี้:

pg_restore: WARNING:  database "blah" does not exist
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 1513; 1259 16435 TABLE checks blah
pg_restore: [archiver (db)] could not execute query: ERROR:  role "blah" does not exist
    Command was: ALTER TABLE public.checks OWNER TO blah;
pg_restore: [archiver (db)] Error from TOC entry 1509; 1259 16409 TABLE users blah
pg_restore: [archiver (db)] could not execute query: ERROR:  role "blah" does not exist
    Command was: ALTER TABLE public.users OWNER TO blah;
pg_restore: [archiver (db)] Error from TOC entry 1508; 1259 16407 SEQUENCE users_id_seq blah
pg_restore: [archiver (db)] could not execute query: ERROR:  role "blah" does not exist
    Command was: ALTER TABLE public.users_id_seq OWNER TO blah;
pg_restore: [archiver (db)] Error from TOC entry 1824; 0 0 ACL public postgres
pg_restore: [archiver (db)] could not execute query: ERROR:  role "postgres" does not exist
    Command was: REVOKE ALL ON SCHEMA public FROM postgres;
pg_restore: [archiver (db)] could not execute query: ERROR:  role "postgres" does not exist
    Command was: GRANT ALL ON SCHEMA public TO postgres;
WARNING: errors ignored on restore: 11

ความคิดใด ๆ

ฉันเคยเห็นมีบางคนใช้ sed script เพื่อแก้ไขดัมพ์ ฉันต้องการหลีกเลี่ยงการแก้ปัญหานั้น แต่ถ้าไม่มีทางเลือกอื่นฉันจะเอามัน มีใครเขียนสคริปต์เพื่อเปลี่ยนชื่อฐานข้อมูลของการถ่ายโอนข้อมูลเพื่อให้แน่ใจว่าไม่มีการเปลี่ยนแปลงข้อมูลหรือไม่?

คำตอบ:


42

วิธีแก้ปัญหาก็ทิ้งมันแบบนี้:

pg_dump --no-owner --no-acl blah > blah.psql

และนำเข้าแบบนี้:

psql blah_devel < blah.psql > /dev/null

ฉันยังได้รับคำเตือนนี้:

WARNING:  database "blah" does not exist

แต่ส่วนที่เหลือดูเหมือนว่าจะทำงาน


2
คุณเป็นผู้ช่วยชีวิต :)
Sri Harsha Kappala

เพื่อนช่วยชีวิต :)
คุณรู้ว่าใคร

11

หากคุณกำลังสร้างการถ่ายโอนข้อความคุณสามารถส่งออกฐานข้อมูลโดยไม่ต้องCREATE DATABASEบิต (เช่นไม่ได้ระบุ-cและ - Cตัวเลือกเพื่อpg_dump); สิ่งนี้จะป้องกันไม่ให้ Postgres พยายามวางสร้างและเชื่อมต่อกับฐานข้อมูล

หากคุณใช้รูปแบบไฟล์เก็บถาวรคุณสามารถระบุ-dตัวเลือกpg_restoreเพื่อตั้งชื่อฐานข้อมูลที่คุณต้องการกู้คืน

ตรวจสอบหน้าคนสำหรับpg_dumpและpg_restoreสำหรับรายละเอียดเพิ่มเติมและไม่ลืมที่จะติดลิงรอยขีดข่วนก่อนที่คุณพยายามนี้ในระบบการผลิตในกรณีที่ฉันซ้ายออกบางรายละเอียดที่สำคัญ


ขอขอบคุณ. ฉันจะลอง -da กับ pg_restore แต่ตอนนี้ฉันทิ้งมันเป็นข้อความและใน pg_dump ฉันไม่ได้ระบุไม่ใช่ -c หรือ -C ฉันแค่เรียก pg_dump databasename ฉันพลาดอะไรไปรึเปล่า?
pupeno

ไม่มีตัวเลือกที่pg_dumpควรสร้างการถ่ายโอนข้อมูลที่คุณกู้คืนลงในฐานข้อมูลใด ๆ ที่คุณเชื่อมต่ออยู่ (เป็นเวลานานแล้วที่ฉันได้ทำการถ่ายโอนข้อมูลและเรียกคืนไปยังฐานข้อมูลอื่น แต่ถ้าไม่มีCREATE& \connectบิต SQL ในการถ่ายโอนข้อความ ไม่ว่าคุณจะอยู่ที่ใดก็ตามเมื่อคุณ\iโอนไฟล์ดัมพ์
voretaq7

pg_dump ในข้อความหรือโหมดไบนารีโดยค่าเริ่มต้นมีการกล่าวถึงชื่อฐานข้อมูลมากมาย
pupeno

6

ตอนนี้ pg_restore มีตัวเลือก -d และคุณสามารถตั้งชื่อฐานข้อมูลสำหรับการนำเข้าข้อมูล

บนแหล่งที่มา :

pg_dump -v -Fc mydb.dmp mydb

บนปลายทาง :

createdb -T template1 mydb2

pg_restore -v -e -d mydb2 mydb.dmp


3
ไวยากรณ์นี้ใช้งานได้สำหรับฉัน: pg_dump -v -Fc mydb > mydb.dmp(pg_dump v9.4.5)
เปาโล
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.