PostgreSQL veritabanını başka bir sunucuya kopyalama


492

Bir geliştirme PostgreSQL veritabanı geliştirme sunucusuna kopyalamak için arıyorum. Bunu yapmanın en hızlı ve en kolay yolu nedir?

Yanıtlar:


666

Bir ara dosya oluşturmanıza gerek yoktur. Yapabilirsin

pg_dump -C -h localhost -U localuser dbname | psql -h remotehost -U remoteuser dbname

veya

pg_dump -C -h remotehost -U remoteuser dbname | psql -h localhost -U localuser dbname

kullanarak psqlveya pg_dumpuzaktaki bir ana bilgisayara bağlanmak için.

Büyük bir veritabanı veya yavaş bir bağlantı ile, bir dosyayı boşaltma ve sıkıştırılmış dosyayı aktarma daha hızlı olabilir.

Kornel'in söylediği gibi, ara bir dosyaya döküme gerek yoktur, sıkıştırılmış çalışmak istiyorsanız sıkıştırılmış bir tünel kullanabilirsiniz

pg_dump -C dbname | bzip2 | ssh  remoteuser@remotehost "bunzip2 | psql dbname"

veya

pg_dump -C dbname | ssh -C remoteuser@remotehost "psql dbname"

ancak bu çözümün her iki uçta da oturum açması gerekir.

Not: pg_dump yedekleme içindir ve psqlgeri yükleme içindir. Bu nedenle, bu yanıttaki ilk komut yerelden uzaktan kumandaya, ikincisi uzaktan yerelden kopyalamaktır . Diğer -> https://www.postgresql.org/docs/9.6/app-pgdump.html


28
Ara dosyalara gerek yoktur - sıkıştırılmış SSH tüneli kullanabilir veya boru kullanabilirsiniz: pg_dump | bzip2 | ssh "bunzip2 | pg_restore"
Kornel

4
Bzip2 kullanıyorsanız, aktarımı hızlandırmak için ssh sıkıştırmasını kapatın!
lzap

8
Verileri üretimden geliştirmeye çekersem nasıl sıkıştırılmış çalışabilirim ? Gelişimden üretime bir SSH bağlantısı kurdum. Öyleyse olur ssh remoteuser@remotehost "pg_dump -C dbname | bzip2" | bunzip2 | psql dbnamemu?
Jeromy French

2
X adıyla uzak bir veritabanını y adıyla yerel bir veritabanına kopyalayabilmenizi beklerdim, ancak @ Ferran'ın çözümü bunun için çalışmaz ... Bana porneL'in çözümü sadece bzip2 dosyalarını bırakır gibi görünüyor Yani bu tek adımlı bir işlem değil. Bu durumda, sanırım y veri tabanını bırakacağım, Ferran'ın x'i geri yükleyen çözümünün "ya da" kısmını kullanacağım, sonra veritabanını y olarak yeniden adlandıracağım.
Darin Peterson

3
Ben de bunu yaptım: (1) pg_dump -C -h uzak ev sahibi -U uzak kullanıcı x | psql -h localhost -U yerel kullanıcı (2) dropdb y (3) psql -U postgres -c 'ALTER VERİTABANI "x" "y" ye YENİDEN ADI
Darin Peterson

131
pg_dump the_db_name > the_backup.sql

Ardından yedeklemeyi geliştirme sunucunuza kopyalayın, aşağıdakilerle geri yükleyin:

psql the_new_dev_db < the_backup.sql

3
Bazıları bunun sorunlu olabileceğini söyledi - bir tetikleyiciye çarptığında dökümü veya geri yüklemenin ölmesine neden olan izin sorunları?
Robin Barnes

17
@rmbarnes: Sorun varsa - düzeltilmeleri gerekir. Ayrıntılı bilgi olmadan bu "Bazıları" ne yaptı - hiç kimse bu iddiayı onaylayamaz veya reddedemez.

4
Pg_dump ile --no-owner bayrağını kullanın. Bu sorunu atlar ve bu yazının ilk düzenlemesi onu kullandı - ama sonra orijinal veritabanına daha fazla sadakat göstermeniz gerektiğini düşündüm.
monte edilmemiş

4
Benim için yukarıdaki yaklaşım şu şekilde çalıştı: pg_dump -C -h host -U kullanıcı adı db_name> / any_directory / dump_schema_and_data_file .Ve dosyadan geri yükleme için: psql -h host -U kullanıcı adı db_name <dump_schema_and_data_file
Ali Raza Bhayani

Bu beni çok ağırlaştırdı. Dosyayı makineler arasında taşımak için Google sürücüsünü kullandım. Zaten yeni makinede veritabanı (Ama boş) beri beri yinelenen anahtar hataları bir sürü var. Ancak, bu bir geliştirme ortamıdır ve hiçbir şeye zarar vermediler.
Chris Mendla

37

Kullanım pg_dump ve daha sonra psql'in veya pg_restore - Eğer pg_dump -fp veya -Fc seçenekleri tercih edip bağlı.

Kullanım örneği:

ssh production
pg_dump -C -Fp -f dump.sql -U postgres some_database_name
scp dump.sql development:
rm dump.sql
ssh development
psql -U postgres -f dump.sql

22

Sürümler arasında geçiş yapmak istiyorsanız (örn. Postgres'i güncellediniz ve localhost üzerinde çalışan 9.1: local32: 5434 üzerinde çalışan 9.1) çalıştırabilirsiniz:

pg_dumpall -p 5432 -U myuser91 | psql -U myuser94 -d postgres -p 5434

Taşıma belgelerine göz atın .


(Myuser91 / postgres) -parola birden çok kez sorulur, ben sadece bir kez şifreyi girmek için bir yolu var mı?
Martin Weber

@MartinWeber Bu belgeye göre bir pgpass dosyası oluşturun postgresql.org/docs/9.4/static/libpq-pgpass.html
Scott Warren

her ikisinin de aynı bağlantı noktaları varsa?
ggnoredo

Farklı sunuculardaysa, ana bilgisayarları belirtmek için -h komutunu kullanabilirsiniz.
Haroldo_OK

16

pg_basebackup Bunu şimdi, özellikle de büyük veritabanları için yapmanın daha iyi bir yolu gibi görünüyor.

Aynı veya daha eski bir ana sürüme sahip bir sunucudan bir veritabanı kopyalayabilirsiniz. Veya daha doğrusu :

pg_basebackup9.1'e kadar aynı veya daha eski bir ana sürümdeki sunucularla çalışır. Ancak, WAL akış modu ( -X stream) yalnızca sunucu sürümü 9.3 ve üstü --format=tarile çalışır ve geçerli sürümün tar biçim modu ( ) yalnızca sunucu sürümü 9.5 veya üstü ile çalışır.

Bunun için kaynak sunucuda ihtiyacınız var:

  1. listen_addresses = '*'hedef sunucudan bağlanabilmek. Bu konu için 5432 numaralı bağlantı noktasının açık olduğundan emin olun.
  2. En az 1 mevcut çoğaltma bağlantısı: max_wal_senders = 1( -X fetch), 2için -X stream(PostgreSQL 12 durumunda varsayılan) veya daha fazlası.
  3. wal_level = replicaveya daha yüksek bir değere ayarlayın max_wal_senders > 0.
  4. host replication postgres DST_IP/32 trustiçinde pg_hba.conf. Bu, pgkümeden DST_IPmakineden herhangi birine erişim sağlar . Daha güvenli bir seçeneğe başvurmak isteyebilirsiniz.

1, 2, 3 değişiklikleri sunucunun yeniden başlatılmasını, değişiklik 4 yeniden yüklenmesini gerektirir.

Hedef sunucuda:

# systemctl stop postgresql@VERSION-NAME
postgres$ pg_basebackup -h SRC_IP -U postgres -D VERSION/NAME --progress
# systemctl start postgresql@VERSION-NAME

11
Yanıtınızda örnek gibi daha fazla ayrıntı verebilir misiniz?
Magnilex

7
Bu, yalnızca her iki makine de aynı PG sürümlerine sahip olduğunda çalışır.
sm

Geliştirme ve üretim için farklı veritabanı sürümlerini kullanma şansınız düşüktür. Son kez, o sırada üretimde 9.5 kullanmışken bazı kodların PG 9.6 ile çalışmadığına dair bir sorun sunmaya çalışırken takım arkadaşlarımdan biriyle hoş olmayan bir konuşma yaptım. Temel yedekleme çok daha hızlı. O zaman pg_upgrade gerekirse gitme yoludur.
Zorg

2
Muhtemelen daha yeni bir sürüme geçmek ve PostgreSQL'i durdurmak istemezsiniz.
x-yuri

1
Şansınız, veritabanınızı her yükselttiğinizde, üretimde yapmadan önce geliştirici ve evrelemede yükseltmenizdir.
andrew lorien

8

DB'nin dökümünü almak için bu komutu yedeklemek istediğiniz veritabanı adıyla çalıştırın.

 pg_dump -U {user-name} {source_db} -f {dumpfilename.sql}

 eg. pg_dump -U postgres mydbname -f mydbnamedump.sql

Şimdi bu döküm dosyasını DB'yi kopyalamak istediğiniz uzak makineye scp.

eg. scp mydbnamedump.sql user01@remotemachineip:~/some/folder/

Uzak makinede DB geri yüklemek için ~ / some / klasöründe aşağıdaki komutu çalıştırın.

 psql -U {user-name} -d {desintation_db}-f {dumpfilename.sql}

 eg. psql -U postgres -d mynewdb -f mydbnamedump.sql

7

Oldukça çok mücadele ettim ve sonunda Rails 4 ile çalışmamı sağlayan yöntem:

eski sunucunuzda

sudo su - postgres
pg_dump -c --inserts old_db_name > dump.sql

Dökümü oluşturmak için postgres linux kullanıcısını kullanmak zorunda kaldım. Ayrıca yeni sunucuda veritabanı oluşturulmasını zorlamak için -c kullanmak zorunda kaldı. --inserts, aksi takdirde benim için çalışmayacak olan INSERT () sözdizimini kullanmasını söyler :(

ardından yeni sunucuda simpy:

sudo su - postgres
psql new_database_name < dump.sql

dump.sql dosyasını sunucu arasında aktarmak için sadece içeriği yazdırmak için "kedi" ve içeriği kopyalamak için yeniden oluşturmak için "nano" kullandım.

Ayrıca, iki veritabanında kullandığım ROL farklıydı, böylece bulmak-döküm tüm sahibi adını değiştirmek zorunda kaldı.


6

Veritabanınızı boşaltın: pg_dump database_name_name > backup.sql


Veritabanınızı geri alın: psql db_name < backup.sql


5

Tablo verilerinizi bir sunucudan başka bir PostgreSQL sunucusuna kopyalamak için bir Linux kabuk betiği paylaşmama izin verin.

Bu blogdan alınan referans:

PostgreSQL Sunucuları arasında veri taşıma için Linux Bash Kabuk Betiği:

#!/bin/bash
psql \
    -X \
    -U user_name \
    -h host_name1 \
    -d database_name \
    -c "\\copy tbl_Students to stdout" \
| \
psql \
    -X \
    -U user_name \
    -h host_name2 \
    -d database_name \
    -c "\\copy tbl_Students from stdin"

Sadece veriyi taşıyorum; lütfen hedef / ikinci veritabanı sunucunuzda boş bir tablo oluşturun.

Bu bir yardımcı program betiğidir. Ayrıca, host_name, database_name, table_name ve diğerleri için parametreler ekleyerek komut dosyasını genel kullanım için değiştirebilirsiniz.


5

Kabul edilen cevap doğrudur, ancak şifreyi etkileşimli olarak girmek istemiyorsanız, bunu kullanabilirsiniz:

PGPASSWORD={{export_db_password}} pg_dump --create -h {{export_db_host}} -U {{export_db_user}} {{export_db_name}} | PGPASSWORD={{import_db_password}} psql -h {{import_db_host}} -U {{import_db_user}} {{import_db_name}}
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.