2010-11-16 11 views
34

Sevgili Hepsi,farklı bir şema ben follwing komutunu kullanarak bir veritabanı adlandırılmış temp1 <br> bir dökümü almış <br>

$ pg_dump -i -h localhost -U postgres -F c -b -v -f pub.backup temp1 

Şimdi ben farklı yılında dökümü geri yüklemek istediğiniz ile veritabanını geri yüklemek istediğiniz veritabanı "db_temp" denir, ama sadece tüm tabloların "db_temp" veritabanında bulunan bir "temp_schema" (fms temp1 veritabanında bulunan varsayılan şema değil) oluşturulmasını istiyorum.

pg_restore komutunu kullanarak bunu yapmanın herhangi bir yolu var mı
Başka herhangi bir yöntem de takdir edilecektir!
Şimdiden teşekkürler!

+6

Sadece bunun hala 2017'de gerçekleştiğini kabul edemiyorum ve çözüm döküm dosyasını kesmek. – Sharky

cevap

9

Kendisi pg_restore içinde bir yolu yoktur. Yapabilecekleriniz, SQL çıktısı üretmek için pg_restore kullanıyor ve bunu değiştirmek için örneğin bir sed komut dosyasıyla gönderiyor. Yine de bu sed dosyası nasıl yazdığınıza dikkat etmelisiniz, bu yüzden verilerinizdeki şeylerle eşleşmiyor ve değişmiyor.

7

Muhtemelen en kolay yöntem basitçe aşağıdaki SQL ile, yani sonra şemanın ismini geri olacaktır:

ALTER SCHEMA my_schema RENAME TO temp_schema 
inanıyorum

Eğer pg_dump çıkışı için sıkıştırılmış arşiv biçimi kullandığınız için olabildiğince bu geri yüklemeden önce değiştirin. Bu seçenek varsayılan çıktıyı kullanmak ve şema isminde bir arama yapmak ve değiştirmek olacaktır, ancak bu riskli olabilir ve dikkatli olmadığınızda verilerin bozulmasına neden olabilir.

+0

Bu çözüm çok fazla karışıklık yaratabilir – abubacker

+3

Hangi yolla? SQL ifadesi, bir şema adını değiştirmenin tek güvenli yoludur. Diğer bir çözüm de başka bir cevapta önerildi ve ikimizin de riskli olduğunu açıklıyoruz. Zayıf downvoting. – Hamish

+1

Şema adını değiştirdim, ancak bundan sonra serach yolunu değiştiremiyorum! Kullanıcı yeniden adlandırıldıktan sonra herhangi bir tabloyu arayamaz! –

3

Yalnızca birkaç tablonuz varsa, bir defada bir tabloyu geri yükleyebilirsiniz, pg_restore, -t tablename belirtildiğinde -d database kabul eder. Tabii ki, tabloları geri yüklemeden önce şemayı kurmanız ve tabloları geri yüklemeyi bitirdiğinizde dizinleri ve kısıtlamaları sıralamanız gerekecektir. Alternatif olarak, farklı bir bağlantı noktasında başka bir sunucu kurun, yeni PostgreSQL sunucusunu kullanarak geri yükleyin, şemayı yeniden adlandırın, dökün ve özgün veritabanınıza geri yükleyin. Bu tabii ki bir klükdendir ama iş bitecek.

Maceralıysanız, veritabanı adını bir hex editörü kullanarak döküm dosyasında değiştirebilirsiniz. Sadece çöplükte tek bir yerde bahsedildiğini ve yeni ve eski veritabanı adlarının aynı olması gerektiği sürece işe yarayacağını düşünüyorum. YMMV, bir üretim ortamında böyle bir şey yapma, eğer bu darbeler ve ev şehrini ve her zamanki feragatnamelerin geri kalanını seviştiğimde beni suçlama.

32

hızlı ve kirli yolu:

1) adlandırmak varsayılan şema:

alter schema public rename to public_save; 

2) varsayılan şema olarak yeni şema oluşturun:

create schema public; 

3) geri veri

pg_restore -f pub.backup db_temp [and whatever other options] 

4) yeniden adlandırma ihtiyaca göre e şemalar:

alter schema public rename to temp_schema; 
alter schema public_save rename to public; 
44

basit çözüm var:

  • yedek düz SQL formatında dökümü (biçim, "p" parametresini kullanarak "--format = p" ya da "oluşturma -F p ") sizin pub.backup.sql favori editörü ile dökümü ve dosyanızın üstünde aşağıdaki iki satırı ekleyin
  • Düzenleme:

şema oluşturmak myschema;

SET search_path myschema TO;

Şimdi komutuyla

psql'i yedek dökümü geri yükleyebilirsiniz -f pub.backup.sql

komut varsayılan olarak myschema ayarlayacak "için search_path set", Böylece, yeni şemalar ve diğer nesneler, daha önce yaşadıkları "varsayılan" şemadan bağımsız olarak, bu şemada oluşturulur.

+0

Büyük bir döküm dosyasının sadece kafasını düzenlemek için düzgün bir yol var mı? Bunun gibi şeyler bile çoğaltmayı içerir: http: // superuser.com/questions/246837/nasıl yapılır-in-the-bas-in-a-in-a-in-a-in-a-dosya-in-the-bas- –

+0

@PeterEhrlich Dosyalarınızın ne kadar büyük ve kullanılabilir RAM bağlı olarak, vim için kullanabilirsiniz Doğrudan bir gzip'd döküm dosyasını açın. Bellekte hala genişliyor ama ben kaydederken sadece kısa bir duraklama ile 750MB (.gz) dosyasını açabildim, düzenleyebilir ve kaydedebildim. YMMV. – David

+0

Dumps'larımın bir veya daha fazla SET search_path'i zaten vardı ...; Kaldırmam gereken satırlar. Düzenlerken ve geri yüklemeden önce "search_path" araması yapmak isteyebilirsiniz. En az bir SET search_path TO ...; Nesnelerin boşaltıldığı her şema için satır. --no-owner seçeneği gibi çalışan --without-schema seçeneği varsa güzel olurdu. – David

0

Şemayı geçici bir veritabanında yeniden adlandırın.

İhracat şema:

pg_dump --schema-only --schema=prod > prod.sql 

yeni bir veritabanı oluşturun. Sadece üstündeki set search_path değiştirebilir

psql -f prod.sql 

ALTER SCHEMA prod RENAME TO somethingelse; 

pg_dump --schema-only --schema=somethingelse > somethingelse.sql 

(veritabanını silmek)

veriler için: İhracat geri yükleyin.

İlgili konular