PostgreSQL veritabanını farklı bir isimle verip almak?


39

PostgreSQL veritabanını dışa aktarmanın ve daha sonra başka bir adla içe aktarmanın bir yolu var mı?

Ben Rails ile PostgreSQL kullanıyorum ve veriyi blah_production adı verilen ve üretimde blah_development ve blah_staging isimleriyle aşamalandıran üretimden veriyi sıklıkla veriyorum. MySQL'de bu, dışa aktarma hiçbir yerde veritabanına sahip olmadığı için önemsizdir (belki bir yorum hariç), ancak PostgreSQL'de bu imkansız gibi görünüyor. İmkansız mı?

Şu anda veritabanını şu şekilde kullanıyorum:

pg_dump blah > blah.dump

-C veya -C seçeneklerini kullanmıyorum. Bu dökümü aşağıdaki gibi ifadeler içeriyor:

COMMENT ON DATABASE blah IS 'blah';

ALTER TABLE public.checks OWNER TO blah;

ALTER TABLE public.users OWNER TO blah;

İle almaya çalıştığımda

psql blah_devel < blah.dump

alırım

WARNING:  database "blah" does not exist

ERROR:  role "blah" does not exist

Belki de sorun gerçekten veritabanı değil, roldür?

Eğer bu şekilde terk edersem:

pg_dump --format=c blah > blah.dump

ve bu şekilde içe aktarmayı deneyin:

pg_restore -d blah_devel < tmp/blah.psql

Bu hataları alıyorum:

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

Herhangi bir fikir?

Orada çöplüğü değiştirmek için sed scripts kullanan bazı insanlar gördüm. Bu çözümden kaçınmak isterdim, ancak alternatif yoksa, ben alırım. Herhangi bir veride değişiklik olmadığından emin olmak için çöplüğün veritabanı adını değiştirmek için bir senaryo yazan var mı?

Yanıtlar:


42

Çözüm şu şekilde atıyordu:

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

ve bu şekilde ithal etmek:

psql blah_devel < blah.psql > /dev/null

Hala bu uyarıyı alıyorum:

WARNING:  database "blah" does not exist

ama gerisi iş gibi görünüyor.


2
Sen bir hayat kurtarıcısın :)
Sri Harsha Kappala

hayat koruyucu bro :)
kim bilir

11

Bir metin dökümü oluşturuyorsanız, veritabanını CREATE DATABASEbitler olmadan dışa aktarabilirsiniz (örn. -cVe - Cseçeneklerini belirtmeyin pg_dump); Bu, Postgres'in veri tabanına bırakmaya, oluşturmaya ve bağlanmaya çalışmasını önleyecektir.

Arşiv biçimlerinden birini kullanıyorsanız , geri yüklemek istediğiniz veritabanını adlandırma -dseçeneğini pg_restorebelirleyebilirsiniz.

Daha fazla ayrıntı için man sayfalarına bakın pg_dumpve bazı önemli detayları dışarıda bıraksam diye, bunu üretim sistemlerinde denemeden önce çizik bir maymunpg_restore monte etmeyi unutmayın .


Teşekkür ederim. Ben -daya pg_restore ile deneyeceğim, ama şimdilik, metin olarak bırakıyorum ve pg_dump'ta ne -c ne de -C belirtmiyorum. Ben sadece pg_dump veri tabanı adını arıyorum. Bir şey mi eksik?
pupeno

hiçbir seçeneğin olmadığı pg_dump, bağlı olduğunuz veritabanına geri yükleyeceğiniz bir döküm oluşturmamalı (bir metin dökümü yaptım ve farklı bir DB'ye geri yüklüyordum, ancak kısa bir süre önce bir metin dökümü yaptım CREATEve \connectbitmişse, dökümü yürütülür. - Nerede olursan ol \idump dosyasını
mport yaparken

pg_dump metin veya ikili modda, varsayılan olarak, veritabanı adından bahseden tonlarca vardır.
pupeno

6

Şimdi pg_restore -d seçeneğine sahiptir ve veri almak için veritabanı adını belirleyebilirsiniz.

kaynak :

pg_dump -v -Fc mydb.dmp mydb

dest :

createdb -T şablon1 mydb2

pg_restore -v - e - d mydb2 mydb.dmp


3
Bu sözdizimi benim için çalıştı: pg_dump -v -Fc mydb > mydb.dmp(pg_dump v9.4.5).
Paolo
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.