Bir geliştirme PostgreSQL veritabanı geliştirme sunucusuna kopyalamak için arıyorum. Bunu yapmanın en hızlı ve en kolay yolu nedir?
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:
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 psql
veya pg_dump
uzaktaki 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 psql
geri 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
ssh remoteuser@remotehost "pg_dump -C dbname | bzip2" | bunzip2 | psql dbname
mu?
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
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
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 .
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_basebackup
9.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=tar
ile ç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:
listen_addresses = '*'
hedef sunucudan bağlanabilmek. Bu konu için 5432 numaralı bağlantı noktasının açık olduğundan emin olun.max_wal_senders = 1
( -X fetch
), 2
için -X stream
(PostgreSQL 12 durumunda varsayılan) veya daha fazlası.wal_level = replica
veya daha yüksek bir değere ayarlayın max_wal_senders > 0
.host replication postgres DST_IP/32 trust
içinde pg_hba.conf
. Bu, pg
kümeden DST_IP
makineden 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
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
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ı.
Veritabanınızı boşaltın: pg_dump database_name_name > backup.sql
Veritabanınızı geri alın: psql db_name < backup.sql
Tablo verilerinizi bir sunucudan başka bir PostgreSQL sunucusuna kopyalamak için bir Linux kabuk betiği paylaşmama izin verin.
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.
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}}