PostgreSQL: วิธีสร้างสคีมาฐานข้อมูลแบบเต็มในฐานข้อมูลเดียวกันได้อย่างไร


26

ฉันจะคัดลอกpublicสคีมาของฉันลงในฐานข้อมูลเดียวกันที่มีโครงสร้างตารางเต็มรูปแบบ, ข้อมูล, ฟังก์ชั่น, fk, pk และอื่น ๆ
เวอร์ชัน Postgres ของฉันคือ 8.4
PS ฉันต้องคัดลอกสคีมาฐานข้อมูล


คุณมี schema มากกว่านี้หรือpublicเปล่า?
a_horse_with_no_name

ฉันมีแบบแผนสาธารณะและตัวอย่าง และฉันจำเป็นต้องคัดลอกเดโมสำหรับสร้างบัญชีเดโม่ ...

นี่จะเป็นสิ่งที่สะดวกที่จะทำ
Kuberchaun

คำตอบ:


19

ไม่มีวิธีง่ายๆในการทำเช่นนี้ใน pg_dump / pg_restore คุณสามารถลองทำสิ่งต่อไปนี้หากคุณสามารถลบฐานข้อมูลได้ชั่วคราว

  1. ใช้ดัมพ์สกีมาสาธารณะของคุณโดยใช้pg_dump
  2. เรียกใช้ "ALTER SCHEMA เปลี่ยนชื่อสาธารณะเป็น public_copy"
  3. กู้คืนดัมพ์สกีมาสาธารณะของคุณจากขั้นตอนที่ 1 โดยใช้pg_restore

ฉันจะเข้าถึง pg_dump และ pg_restore ผ่าน PHP ได้อย่างไร

ขึ้นอยู่กับตำแหน่งที่คุณใช้ฐานข้อมูล คุณสามารถเข้าถึง pg_dump และ pg_restore ได้จากเชลล์บนเซิร์ฟเวอร์ของคุณ หากคุณไม่มีสิทธิ์เข้าถึงเชลล์คุณสามารถลองใช้ PHPs shell_execไม่เช่นนั้นคุณจะต้องค้นหาวิธีสำรองข้อมูลอื่น ๆ โดยใช้PostgreSQL GUI Tool

1
+1 นั่นคือทางออกที่ฉลาดที่สุดในตอนนี้ เชลล์คำสั่งจะมีลักษณะบางอย่างเช่นนี้ ( มากขึ้นในคู่มือการใช้งานpg_dump -n my_schema -f '/path/to/file.pgsql' my_db ): ที่ง่ายที่สุดเป็น superuser ( postgres) กับ PW-น้อยอนุมัติในpeer pg_haba.confRestore psql my_db -f '/path/to/file.pgsql'หลังจากที่คุณได้เปลี่ยนชื่อสคีเดิม: หากคุณมีการถ่ายโอนข้อมูล SQL ธรรมดาที่คุณทำไม่pg_restoreจำเป็นต้อง
Erwin Brandstetter

มีวิธีง่าย ๆ ดูคำตอบของฉัน pg_dump สนับสนุนสวิตช์ -n สำหรับการเลือกสคีมา จากนั้นเพียงแก้ไขชื่อสกีมาในการถ่ายโอนข้อมูลและโหลดซ้ำ
Scott Marlowe

2
อ้างอิงเพียงแค่เปลี่ยนชื่อสคีมาจะไม่ได้รับการปรับปรุงภายในฟังก์ชั่น: gist.github.com/pschultz/5387172 การเปลี่ยนชื่อเป็นการถ่ายโอนข้อมูลมีความน่าเชื่อถือมากกว่าหากคุณได้รับการค้นหาและแทนที่ถูกต้อง
ปีเตอร์

9
pg_dump -n schema_name > dump.sql
vi dump.sql # edit the schema name
psql: psql -f dump.sql

หากคุณติดอยู่กับ php ให้ใช้สำบัดสำนวนอย่างใดอย่างหนึ่ง

`/usr/bin/pg_dump-n myschema mydb -U username > /tmp/dump.sql`

หรือคำสั่ง exec () สำหรับการเปลี่ยนแปลงคุณสามารถใช้ sed แบบเดียวกัน

ที่นี่มีอีก 6 ตัวอักษร


1
มันปลอดภัยที่จะเปลี่ยนชื่อสคีมาและโหลดสคีมาดั้งเดิมที่สำรองไว้โดยเฉพาะเมื่อชื่อสคีมาอาจปรากฏเป็นเนื้อหา (เช่นpublic)
artm

7

ใช้ pgAdmin คุณสามารถทำสิ่งต่อไปนี้ มันเป็นคู่มือสวย แต่อาจเป็นสิ่งที่คุณต้องการ วิธีการที่ใช้สคริปต์จะเป็นที่ต้องการมากขึ้น ไม่แน่ใจว่าวิธีนี้จะทำงานได้ดีถ้าคุณไม่มีสิทธิ์การเข้าถึงระดับผู้ดูแลระบบและฐานข้อมูลของคุณมีขนาดใหญ่ แต่ควรใช้งานได้ดีกับฐานข้อมูลการพัฒนาที่คุณเพิ่งมีในคอมพิวเตอร์ของคุณ

  1. คลิกขวาที่ชื่อสกีมาที่คุณต้องการคัดลอกและคลิกสำรองข้อมูล (คุณสามารถไปให้ลึกกว่านี้และเลือกที่จะสำรองโครงสร้างแทนทั้งสองอย่าง)

  2. ตั้งชื่อไฟล์สำรองข้อมูลและเลือกรูปแบบ (ฉันมักจะใช้น้ำมันดิน)

  3. คลิกสำรองข้อมูล

  4. คลิกขวาที่สกีมาที่คุณสำรองและคลิกคุณสมบัติแล้วเปลี่ยนชื่อเป็นอย่างอื่นชั่วคราว (เช่นอุณหภูมิ )

  5. คลิกราก schemas และคลิกขวาในเบราว์เซอร์วัตถุและคลิกสร้างโครงสร้างใหม่และให้คีชื่อประชาชน นี่จะเป็นสคีมาที่คุณคัดลอกมาจากข้อมูลสำรองของคุณ

  6. คลิกขวาที่โครงสร้างใหม่ของประชาชนจากขั้นตอนที่ 5 และคลิกเรียกคืน กู้คืนจากไฟล์สำรองในขั้นตอนที่ 3

  7. เปลี่ยนชื่อโครงสร้างใหม่ของประชาชนกับชื่อที่แตกต่างกัน (เช่นnewSchema )

  8. เปลี่ยนชื่อtemprename schema จากขั้นตอนที่ 4 กลับไปเป็นชื่อเดิม


สคีมาใหม่ที่สร้างในขั้นตอนที่ 5 จะต้องมีชื่อเดียวกับสคีมาที่คุณสำรองไว้มิฉะนั้น pgAdmin จะไม่กู้คืนสิ่งใด
Cao Minh Tu

5

คุณสามารถใช้

CREATE DATABASE new_db TEMPLATE = old_db;

จากนั้นปล่อยสกีมาทั้งหมดที่คุณไม่ต้องการ:

DROP SCHEMA public CASCADE;
DROP SCHEMA other CASCADE;

ข้อเสียเปรียบเพียงอย่างเดียวคือการเชื่อมต่อทั้งหมดไปยัง old_db ต้องถูกกำหนดก่อนที่คุณจะสามารถสร้างสำเนาได้ (ดังนั้นกระบวนการที่รันCREATE DATABASEคำสั่งจะต้องเชื่อมต่อเช่นกับเทมเพลต 1)

หากไม่ใช่ตัวเลือก pg_dump / pg_restore เป็นวิธีเดียวที่จะทำได้


1
ก่อนที่ฉันจะถามคำถามนี้ฉันใช้วิธีที่คล้ายกันในการโคลนฐานข้อมูล แต่มันใช้เวลามากเวลาและฉันคิดว่าโคลนสคีเดียวที่เป็นได้เร็วขึ้นมาก ...

@sigra: วิธีการโคลนของ a_horse นั้นเร็วที่สุดสำหรับฐานข้อมูลเพราะไฟล์จริงสามารถคัดลอกได้ซึ่งช่วยประหยัดค่าใช้จ่ายได้มาก ฉันสงสัยว่าดัมพ์และการรีโหลดของ schema จะเร็วขึ้นเว้นแต่ว่า schema นั้นเป็นเพียงส่วนเล็ก ๆ ของ db ทั้งหมด ดังนั้น +1 สำหรับคำตอบนี้แม้ว่าจะไม่ได้ตอบคำถามจริงที่ถาม
Erwin Brandstetter

นั่นเป็นเรื่องที่ต้องทำหลายอย่างเพื่อโคลนแบบแผนเดียว ทิ้งสคีมาเปลี่ยนชื่อในการถ่ายโอนข้อมูลและโหลดได้เร็วขึ้นมาก
Scott Marlowe

@ScottMarlowe: ขึ้นอยู่กับสคีมาที่ใหญ่ที่สุด ถ้าสิ่งที่ใหญ่ที่สุดคืออันที่ถูกปล่อยออกมาฉันก็เห็นด้วย
a_horse_with_no_name

2

การขยายคำตอบของผู้ใช้11,1,185 คนนี่เป็นกระบวนการทำงานเต็มรูปแบบโดยใช้ psql / pg_dump

ต่อไปนี้จะทำการส่งออกออบเจ็กต์ทั้งหมดold_schemaและนำเข้าสู่new_schemaสคีมาใหม่userในdbnameฐานข้อมูล:

psql -U user -d dbname -c 'ALTER SCHEMA old_schema RENAME TO new_schema'
pg_dump -U user -n new_schema -f new_schema.sql dbname
psql -U user -d dbname -c 'ALTER SCHEMA new_schema RENAME TO old_schema'
psql -U user -d dbname -c 'CREATE SCHEMA new_schema'
psql -U user -q -d dbname -f new_schema.sql
rm new_schema.sql
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.