PostgreSQL: Aynı veritabanında tam veritabanı şeması kopyası nasıl oluşturulur?


26

Nasıl kopyalayabilirsiniz publicvs. tam tablo yapısı, veri, fonksiyonlar, fk, pk ve aynı veritabanına şema
8.4 Postgres Benim sürümü olduğunu
kopyalamak için PS I ihtiyacı şema DEĞİL veritabanını


Daha fazla şema var publicmı , yoksa sadece mı?
a_horse_with_no_name

Kamu ve demo şemalarım var. Demo hesabı oluşturmak için demo kopyalamam gerekiyor ...

Bu, yapabilmek için kullanışlı bir şey olurdu.
Kuberchaun,

Yanıtlar:


19

Bunu pg_dump / pg_restore içinde yapmanın basit bir yolu yoktur. Veritabanını geçici olarak kaldırabiliyorsanız, aşağıdakileri deneyebilirsiniz.

  1. Pg_dump kullanarak genel şemanızın bir dökümü atın
  2. "ALTER SCHEMA public RENAME TO public_copy" komutunu çalıştırın
  3. Pg_restore'u kullanarak genel şemanın dökümünü 1. adımdan geri yükle

pg_dump ve pg_restore'a PHP ile nasıl erişebilirim?

Bu, veritabanını nerede çalıştırdığınıza bağlıdır. Pg_dump ve pg_restore'a sunucunuzdaki kabuktan erişebilirsiniz. Kabuk erişiminiz yoksa, PHP kabuk_exec'i kullanmayı deneyebilirsiniz , aksi takdirde alternatif bir yedekleme yöntemine bakmanız gerekebilir, belki bir PostgreSQL GUI Aracı

1
+1 Bu, şu ana kadarki en akıllı çözüm. Kabuk komutu (böyle bir şey olmazdı kılavuzda daha ): pg_dump -n my_schema -f '/path/to/file.pgsql' my_db. postgresPw-az peeryetkilendirme ile superuser ( ) kadar kolay pg_haba.conf. Özgün şema adını sonra Restore: psql my_db -f '/path/to/file.pgsql'. Eğer düz bir SQL dökümü varsa, do not gerek pg_restore.
Erwin Brandstetter

Kolay bir yolu var, cevabımı görün. pg_dump bir şema seçmek için -n anahtarını destekler. Ardından, dökümdeki şema adını düzenleyin ve yeniden yükleyin.
Scott Marlowe,

2
Basitçe şemayı yeniden adlandırmak, fonksiyonların içindeki referansları güncellemeyecektir: gist.github.com/pschultz/5387172 . İsminizi değiştirmek, aramanızı bulup sağa değiştirirseniz, çok daha güvenilirdir.
Peter

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

Php ile sıkışmış iseniz o zaman ya geri tikleri kullanın

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

veya exec () komutu. Değişiklik için sed'i aynı şekilde kullanabilirsiniz.

6 karakter daha


1
şemayı yeniden adlandırmak ve yedeklenmiş orijinal şemayı geri yüklemek, özellikle şema adı içerik olarak göründüğü zaman daha güvenlidir (örn. public).
artm

7

PgAdmin'i kullanarak aşağıdakileri yapabilirsiniz. Oldukça manuel, ancak ihtiyacınız olan her şey olabilir. Betik tabanlı bir yaklaşım çok daha istenir olacaktır. Yönetici erişiminiz yoksa ve veritabanınız büyükse bunun ne kadar işe yarayacağından emin değilsiniz, ancak yerel bilgisayarınızda bulunan bir geliştirme veritabanında gayet iyi çalışmalıdır.

  1. Kopyalamak istediğiniz şema adına sağ tıklayın ve Yedekle seçeneğine tıklayın. (Bundan daha derine inebilir ve her ikisini de yerine yapıyı yedeklemeyi seçebilirsiniz).

  2. Yedekleme dosyasına bir isim verin ve ayrıca bir format seçin. (Genellikle Tar kullanırım.)

  3. Yedekle'ye tıklayın.

  4. Yedeklediğiniz şemaya sağ tıklayın ve özellikleri tıklayın ve geçici olarak başka bir şeye yeniden adlandırın. (örn. temprename )

  5. Şemaları kök tıklayın ve nesne tarayıcıda sağ tıklayın ve yeni bir şema oluşturmak ve şema adı vermek halkı . Bu, yedeklemenizden kopyaladığınız şema olacaktır.

  6. Yeni şema sağ tıklayın halkı 5. adımdan itibaren ve geri yükleme tıklayın. 3. adımda yedek dosyadan geri yükleyin.

  7. Yeni şema yeniden adlandırma halkı farklı bir ad (örn newschema ).

  8. Şema temprename değişiklik adım 4'ten özgün adı için yeniden adlandırın .


5. adımda oluşturulan yeni şema, yedeklediğiniz şema ile aynı ada sahip olmalıdır, aksi takdirde pgAdmin hiçbir şeyi geri yüklemez.
Cao Minh Tu

5

Kullanabilirsin

CREATE DATABASE new_db TEMPLATE = old_db;

Sonra ihtiyacınız olmayan tüm şemaları bırakın:

DROP SCHEMA public CASCADE;
DROP SCHEMA other CASCADE;

Tek dezavantajı, kopyayı oluşturabilmeniz için önce old_db ile olan bağlantıların belirlenmesi gerekir (bu nedenle CREATE DATABASEifadeyi çalıştıran işlem örneğin template1'e bağlanmalıdır)

Bu bir seçenek değilse, pg_dump / pg_restore bunu yapmanın tek yoludur.


1
Bu soruyu sormadan önce, bir veritabanını klonlamak için benzer bir yöntem kullandım. Ama çok fazla zaman harcıyor ve bence sadece şema klonlamanın çok daha hızlı olduğunu düşünüyorum ...

@sigra: klonlama a_horse metodu olan gerçek dosyalar sadece yükü bir sürü kazandırır, kopyalanabilir çünkü veritabanları için en hızlı kullanılabilir. Bir dökümü ve şemanın yeniden yüklenmesi şema tüm db'nin sadece küçük bir parçası olmadığı sürece daha hızlı olacağından şüpheliyim. Yani, sorulan asıl soruyu cevaplamasa bile bu cevap için +1.
Erwin Brandstetter

Tek bir şema klonlamak için çok fazla iş var. şemadan çıkmak, çöplükte yeniden adlandırmak ve yeniden yüklemek çok daha hızlı.
Scott Marlowe

@ScottMarlowe: en büyük şemanın hangisine bağlı olduğuna bağlıdır. En büyüğü düşürülenlerden biriyse, evet, katılıyorum.
a_horse_with_no_name

2

user1113185 cevap genişleyen , işte psql / pg_dump kullanarak tam bir iş akışı.

Aşağıdakiler, tüm nesnelerini dışa old_schemaaktarır ve veritabanında new_schemaolduğu gibi yeni şemaya aktarır :userdbname

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.