PostgreSQL: Bagaimana cara membuat salinan lengkap skema database dalam database yang sama?


26

Bagaimana saya bisa menyalin publicskema saya ke database yang sama dengan struktur tabel penuh, data, fungsi, fk, pk, dll.
Versi Postgres saya adalah 8,4
PS Saya perlu menyalin skema BUKAN basis data


Apakah Anda memiliki lebih banyak skema, atau hanya public?
a_horse_with_no_name

Saya memiliki skema publik dan demo. Dan saya perlu menyalin demo untuk membuat akun demo ...

Ini akan menjadi hal yang berguna untuk dapat dilakukan.
Kuberchaun

Jawaban:


19

Tidak ada cara sederhana untuk melakukan ini di pg_dump / pg_restore itu sendiri. Anda dapat mencoba yang berikut jika Anda dapat menghapus basis data sementara.

  1. Ambil dump skema publik Anda menggunakan pg_dump
  2. jalankan "ALTER SCHEMA public RENAME TO public_copy"
  3. Kembalikan dump skema publik Anda dari langkah 1 menggunakan pg_restore

bagaimana saya bisa mengakses ke pg_dump dan pg_restore melalui PHP?

Itu tergantung di mana Anda menjalankan database. Anda dapat mengakses pg_dump dan pg_restore dari shell di server Anda. Jika Anda tidak memiliki akses shell maka Anda dapat mencoba menggunakan PHP shell_exec , jika tidak, Anda harus melihat ke metode cadangan alternatif, mungkin menggunakan Alat GUI PostgreSQL

1
+1 Itulah solusi paling cerdas sejauh ini. Perintah shell akan terlihat seperti ini ( lebih di manual ): pg_dump -n my_schema -f '/path/to/file.pgsql' my_db. Paling mudah sebagai superuser ( postgres) dengan peerotorisasi pw-kurang di pg_haba.conf. Kembalikan setelah Anda telah berganti nama skema asli: psql my_db -f '/path/to/file.pgsql'. Jika Anda memiliki dump SQL biasa, Anda tidak perlu pg_restore.
Erwin Brandstetter

Ada cara mudah, lihat jawaban saya. pg_dump mendukung saklar -n untuk memilih skema. Kemudian cukup edit nama skema di dump dan muat ulang.
Scott Marlowe

2
Cukup mengganti nama skema tidak akan memperbarui referensi di dalam fungsi: gist.github.com/pschultz/5387172 . Mengganti nama adalah dump jauh lebih dapat diandalkan jika Anda mendapatkan pencarian Anda dan ganti yang benar.
Peter

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

Jika Anda terjebak dengan php, maka gunakan kembali tics

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

atau perintah exec (). Untuk perubahan Anda bisa menggunakan sed dengan cara yang sama.

Ini ada 6 karakter lagi


1
lebih aman untuk mengganti nama skema dan memuat kembali skema asli yang didukung, terutama ketika nama skema mungkin muncul sebagai konten (misalnya public).
artm

7

Menggunakan pgAdmin Anda dapat melakukan hal berikut. Ini cukup manual, tapi mungkin itu yang Anda butuhkan. Pendekatan berbasis skrip akan jauh lebih diinginkan. Tidak yakin seberapa baik ini akan bekerja jika Anda tidak memiliki akses admin dan jika database Anda besar, tetapi harus berfungsi dengan baik pada database pengembangan yang baru saja Anda miliki di komputer lokal Anda.

  1. Klik kanan nama skema yang ingin Anda salin dan klik Cadangan. (Anda bisa lebih dalam dari ini dan memilih untuk hanya mencadangkan struktur daripada keduanya).

  2. Beri nama file cadangan dan juga pilih format. (Saya biasanya menggunakan Tar.)

  3. Klik Cadangkan.

  4. Klik kanan skema yang Anda buat cadangannya dan klik properti dan ubah namanya menjadi sesuatu yang lain untuk sementara. (mis. temprename )

  5. Klik akar skema dan klik kanan di browser objek dan klik buat skema baru dan beri nama skema publik . Ini akan menjadi skema yang Anda salin dari cadangan Anda.

  6. Klik kanan skema publik baru dari langkah 5. dan klik pulihkan. Pulihkan dari file cadangan di langkah 3.

  7. Ubah nama skema publik menjadi nama yang berbeda (mis., Newschema ).

  8. Ganti nama skema, ubah temprename dari langkah 4 kembali ke nama aslinya.


Skema baru yang dibuat pada langkah 5 harus memiliki nama yang sama dengan skema yang Anda buat cadangannya, jika tidak pgAdmin tidak akan mengembalikan apa pun.
Cao Minh Tu

5

Anda bisa menggunakannya

CREATE DATABASE new_db TEMPLATE = old_db;

Lalu lepas semua skema yang tidak Anda butuhkan:

DROP SCHEMA public CASCADE;
DROP SCHEMA other CASCADE;

Satu-satunya kelemahan adalah semua koneksi ke old_db harus ditentukan sebelum Anda dapat membuat salinan (sehingga proses yang menjalankan CREATE DATABASEpernyataan harus terhubung misalnya ke template1)

Jika itu bukan opsi, pg_dump / pg_restore adalah satu-satunya cara untuk melakukannya.


1
Sebelum saya mengajukan pertanyaan ini, saya menggunakan metode kloning database yang serupa. Tapi itu menghabiskan banyak waktu dan saya pikir kloning satu-satunya skema jauh lebih cepat ...

@ Sigra: Metode kloning a_horse adalah yang tercepat yang tersedia untuk basis data, karena file aktual dapat disalin, yang menghemat banyak biaya overhead. Saya ragu dump dan pemuatan ulang skema akan lebih cepat kecuali skema hanya sebagian kecil dari keseluruhan db. Jadi, +1 untuk jawaban ini meskipun tidak menjawab pertanyaan aktual yang diajukan.
Erwin Brandstetter

Itu banyak pekerjaan untuk mengkloning satu skema. membuang skema, mengganti namanya di dump dan memuat ulang jauh lebih cepat.
Scott Marlowe

@ScottMarlowe: tergantung skema mana yang terbesar. Jika yang terbesar adalah salah satu yang jatuh, maka ya saya setuju.
a_horse_with_no_name

2

memperluas jawaban user1113185 , inilah alur kerja lengkap menggunakan psql / pg_dump.

Berikut ini ekspor semua objek old_schemadan impor ke new_schemaskema baru , seperti user, dalam dbnamedatabase:

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.