Postgres'te bir tabloyu bir veritabanından diğerine kopyalama


273

Postgres bir veritabanından diğerine tüm tablo kopyalamaya çalışıyorum. Baska öneri?


1
DBeaver'ı yüklemede sorun yoksa, bağlandığınız iki veritabanı arasında aktarmanın gerçekten basit bir yolu vardır. Kaynak tabloya sağ tıklayın ve Verileri Dışa Aktar'ı seçin, bir Veritabanı tablolarını hedefleyin ve hedefi hedef veritabanı olarak ayarlayın.
rovyko

Yanıtlar:


311

Tabloyu çıkarın ve doğrudan hedef veritabanına ekleyin:

pg_dump -t table_to_copy source_db | psql target_db

Not: Diğer veritabanında zaten tablo ayarlanmışsa, -abayrağı yalnızca verileri içe aktarmak için kullanmalısınız , aksi takdirde "Bellek yetersiz" gibi garip hatalar görebilirsiniz:

pg_dump -a -t my_table my_db | psql target_db

5
Bu uzaktan db bağlantıları için nasıl çalışır? Örneğin, farklı bir yerden boşaltmam gerekiyor.
curlyreggie

17
@curlyreggie bunu denemedi, ama neden işe yaramadığını görmüyorum. Komuta kullanıcı ve sunucu özelliklerini eklemeyi deneyin, öylepg_dump -U remote_user -h remote_server -t table_to_copy source_db | psql target_db
thomax

2
Bunu deneyebilirsiniz: "pg_dump -U remote_user -h remote_server -t table_to_copy source_db | psql target_db -U remote_user -h remote_server"
Hua Zhang

18
diğer veritabanında zaten tablo ayarlanmışsa, -abayrağı yalnızca veri için kullanmanız gerektiğini unutmayın . yani pg_dump -a -t my_table my_db | psql target_db. Ben buradayken, Veritabanınız bir sunucudaysa, veritabanını bir dosyaya döküp daha sonra bu dosyayı veritabanına scp, daha sonra dosyanın içeriğini psql'e göndermek daha kolay buluyorum. örneğin pg_dump -a -t my_table my_db > my_file.sqlve bunu sunucunuza koyduktan sonra ->psql my_other_db < my_file.sql
Nick Brady

3
@EamonnKenny küçük harfe duyarlı tablo dökümü yapın: pg_dump -t '"tableToCopy"' source_db | psql target_db. Tablo adını tek VE çift tırnak işaretleri içine
alındığını unutmayın

105

Yedekleme işlevini pgAdmin II'de de kullanabilirsiniz. Şu adımları uygulamanız yeterlidir:

  • PgAdmin'de, taşımak istediğiniz tabloya sağ tıklayın, "Yedekle" yi seçin
  • Çıktı dosyasının dizinini seçin ve Biçimi "düz" olarak ayarlayın
  • "Döküm Seçenekleri # 1" sekmesini tıklayın, "Yalnızca veri" veya "yalnızca Şema" yı kontrol edin (ne yaptığınıza bağlı olarak)
  • Sorgular bölümünün altında, "Sütun Eklerini Kullan" ve "Kullanıcı Ekleme Komutları" nı tıklayın.
  • "Yedekle" düğmesini tıklayın. Bu bir .backup dosyasına çıktı
  • Bu yeni dosyayı not defteri kullanarak açın. Tablo / veriler için gereken ekleme komut dosyalarını göreceksiniz. Bunları kopyalayıp pgAdmin'deki yeni veritabanı sql sayfasına yapıştırın. PgScript olarak çalıştır - Sorgu-> pgScript F6 olarak çalıştır

İyi çalışır ve bir kerede birden fazla tablo yapabilir.


1
Bu, veritabanları arasında veri taşımak için iyi bir gui tabanlı çözümdür. Teşekkürler!
kgx

3
ObjectsBölümün altında birden çok tablo seçebilirsiniz . OSX'te, SQL düğmesine tıklayın veya yedekleme dosyasından kopyalanan SQL'i yapıştırmak SQL Editoriçin Toolsmenüyü edinin .
Aleck Landgraf

çalışıyor, teşekkürler. Çok yavaş olsa da büyük tablolarda .. hızlandırmak için daha iyi bir yolu var mı? (yabancı anahtarları görmezden gelmek gibi bir şey mi?)
TimoSolo

3
@Timothy İşte yedekleme ve geri yükleme hızını artırmak için postgres dokümantasyon sayfası
laurie

eski yanıt ama yine de alakalı, harika çalışıyor, sadece tüm veritabanını dışa aktarırken tetikleyicileri
devre dışı bırakmayı

75

Dblink kullanmak daha uygun olurdu!

truncate table tableA;

insert into tableA
select *
from dblink('dbname=postgres hostaddr=xxx.xxx.xxx.xxx dbname=mydb user=postgres',
            'select a,b from tableA')
       as t1(a text,b text);

12
Neden iki kez iki dbname ..? hangisi kaynak ve hedef.?
arulraj.net

1
Eklediğimiz tableA hedef ve dbLink'teki tableA kaynaktır.
aggietech

dblink bun kullanmak istiyorsanız kaynak kaynak tablosunun yapısını bilmiyorum?
Ossarotte

31

Her iki sunucuya da bağlantısı olan Linux ana bilgisayarında psql kullanma

( export PGPASSWORD=password1 
  psql -U user1 -h host1 database1 \
  -c "copy (select field1,field2 from table1) to stdout with csv" ) \
| 
( export PGPASSWORD=password2 
  psql -U user2 -h host2 database2 \ 
   -c "copy table2 (field1, field2) from stdin csv" )

Dışa PGPASSWORD=password1 psql -U ...aktarmaya gerek yok , o zaman açık alt kabuklara bile ihtiyacınız yok! Normalde, önce kurmak için birkaç şey yapmak istersiniz, bu nedenle alt kabuklar yine de gerekli olabilir. Ayrıca, şifreler sonraki işlemlere aktarılmaz. Teşekkürler!
Sınırlı Kefaret

1
@LimitedAtonement Aslında haklısınız, dışa aktarma ve alt kabuklar gerekli değil. Bu sadece daha karmaşık komut dosyasının bir parçası ve hatta ihracat ve alt kabuklar olmadan denemedim, bu yüzden, sadece dürüst olmak ve işe yaramış bir çözüm sunmak için
sağladım

Tablo hedef DB'de bulunmalıdır. pg_dump -t '<table_name>' --schema-only
Oluşturmak için

24

İlk kurulum dblink

Sonra şöyle bir şey yaparsınız:

INSERT INTO t2 select * from 
dblink('host=1.2.3.4
 user=*****
 password=******
 dbname=D1', 'select * t1') tt(
       id int,
  col_1 character varying,
  col_2 character varying,
  col_3 int,
  col_4 varchar 
);

1
Bu yanıt harika çünkü kopyalanan satırları filtrelemeye izin veriyor (dblink 2. bağımsız değişkenine WHERE yan tümcesi ekleyin). Ancak, sütun isimleri (Postgres 9.4) gibi bir şeyle açık olmalıdır: INSERT INTO l_tbl (l_col1, l_col2, l_col3) SELECT * FROM dblink('dbname=r_db hostaddr=r_ip password=r_pass user=r_usr', 'select r_col1, r_col2, r_col3 from r_tbl where r_col1 between ''2015-10-29'' AND ''2015-10-30'' ') AS t1(col1 MACADDR, col2 TIMESTAMP, col3 NUMERIC(7,1));(l yerel, r uzak. Tek tırnaklardan kaçın.
Sütun

14

Tablo verilerinin dökümünü almak için pg_dump komutunu kullanın ve ardından psql ile geri yükleyin.


2
Ardından, yeterli izinlere sahip bir rol olan bağlanmak için başka bir veritabanı rolü kullanın. postgresql.org/docs/8.4/static/app-pgdump.html
Frank Heikens

Neyi yanlış yapıyorum? pg_dump -t "tablename" dbName --role "postgres"> db.sql "postgres" rolünü ayarlamaya çalıştığım kullanıcı olur. Hala bana "Erişim reddedildi" veriyor.
nix

Db.sql dosyasını yazma izniniz var mı?
pcent

Hangi izinlere sahip olduğumu nasıl kontrol ederim?
nix

Bu iş parçacığı eski, ancak sorunu olan herkes için, PgAdminIII'deki izin sorunlarını giderecek gibi görünen 'Araçlar -> Yedekleme' menüsünü kullanmayı deneyin.
John

13

Her iki uzak sunucunuz varsa bunu takip edebilirsiniz:

pg_dump -U Username -h DatabaseEndPoint -a -t TableToCopy SourceDatabase | psql -h DatabaseEndPoint -p portNumber -U Username -W TargetDatabase

Zaten mevcut bir şemanız varsa, söz konusu kaynak Veritabanı tablosunu aynı adlandırılmış hedef veritabanı tablosuna kopyalar.



8

İşte benim için işe yarayan. İlk olarak bir dosyaya döküm:

pg_dump -h localhost -U myuser -C -t my_table -d first_db>/tmp/table_dump

ardından dökülen dosyayı yükleyin:

psql -U myuser -d second_db</tmp/table_dump

dökümü yükü için de "-h localhost" gerekir
DTukans

6

Bir tabloyu yerel kurulumunuzda A veritabanından B veritabanına taşımak için aşağıdaki komutu kullanın:

pg_dump -h localhost -U owner-name -p 5432 -C -t table-name database1 | psql -U owner-name -h localhost -p 5432 database2

Denedim. Bu işe yaramaz, çünkü yalnızca ilk şifreyi verebilirsiniz.
en fazla

1
@max export PGPASSWORD=<passw>komutu çalıştırmadan önce yapabilirsiniz
lukaszzenko

4

Burada bazı çözümleri denedim ve gerçekten yardımcı oldular. Deneyimlerime göre en iyi çözüm psql komut satırı kullanmaktır , ancak bazen psql komut satırı kullanmak gibi hissetmiyorum. İşte pgAdminIII için başka bir çözüm

create table table1 as(
 select t1.* 
 from dblink(
   'dbname=dbSource user=user1 password=passwordUser1',
   'select * from table1'  
  ) as t1(
    fieldName1 as bigserial,
    fieldName2 as text,
    fieldName3 as double precision 
  )
 )

Bu yöntemin sorunu, kopyalamak istediğiniz alanların adlarının ve tablo türlerinin yazılması gerektiğidir.


4

pg_dump her zaman çalışmaz.

Her iki dbs'de aynı tablo ddl'sine sahip olduğunuz göz önüne alındığında, aşağıdaki gibi stdout ve stdin'den hackleyebilirsiniz:

 # grab the list of cols straight from bash

 psql -d "$src_db" -t -c \
 "SELECT column_name 
 FROM information_schema.columns 
 WHERE 1=1 
 AND table_name='"$table_to_copy"'"
 # ^^^ filter autogenerated cols if needed     

 psql -d "$src_db" -c  \
 "copy ( SELECT col_1 , col2 FROM table_to_copy) TO STDOUT" |\
 psql -d "$tgt_db" -c "\copy table_to_copy (col_1 , col2) FROM STDIN"

3

User5542464 ve Piyush S. Wanare'nin cevaplarıyla aynıdır, ancak iki adıma bölünmüştür:

pg_dump -U Username -h DatabaseEndPoint -a -t TableToCopy SourceDatabase > dump
cat dump | psql -h DatabaseEndPoint -p portNumber -U Username -W TargetDatabase

aksi halde boru aynı anda iki şifreyi sorar.


Hedef veritabanının tablo adından bahsetme ihtimalim var mı?
Piyush S. Wanare

2

Bir tablo verisini farklı veritabanındaki başka bir tabloya kopyalamak için DbLink kullanmanız gerekir. Çapraz veritabanı sorgusu yürütmek için DbLink uzantısını yüklemeniz ve yapılandırmanız gerekir.

Bu konuda zaten ayrıntılı bir gönderi oluşturdum. Lütfen bu bağlantıyı ziyaret edin


2

Bu python komut dosyasını kontrol edin

python db_copy_table.py "host=192.168.1.1 port=5432 user=admin password=admin dbname=mydb" "host=localhost port=5432 user=admin password=admin dbname=mydb" alarmrules -w "WHERE id=19" -v
Source number of rows = 2
INSERT INTO alarmrules (id,login,notifybyemail,notifybysms) VALUES (19,'mister1',true,false);
INSERT INTO alarmrules (id,login,notifybyemail,notifybysms) VALUES (19,'mister2',true,false);

1

Eğer her iki DB de (from ve to) parola korumalıysa, bu senaryoda terminal her iki DB için parola istemez, parola istemi yalnızca bir kez görünür. Yani, bunu düzeltmek için, komutlarla birlikte şifreyi geçirin.

PGPASSWORD=<password> pg_dump -h <hostIpAddress> -U <hostDbUserName> -t <hostTable> > <hostDatabase> | PGPASSWORD=<pwd> psql -h <toHostIpAddress> -d <toDatabase> -U <toDbUser>

1

Ben kullanıyordum DataGrip (Intellij Idea Göre). ve verileri bir tablodan (farklı bir veritabanında diğerine) kopyalamak çok kolaydı.

İlk olarak, Data Grip'teki her iki DataSources ile bağlı olduğunuzdan emin olun.

Kaynak Tablosu'nu seçin ve F5 tuşuna basın veya (Sağ tıklayın -> Tabloyu Şuraya Kopyala'yı seçin.)

Bu size tüm tabloların bir listesini gösterir (açılır pencerede bir tablo adı kullanarak da arama yapabilirsiniz). Sadece hedefinizi seçin ve OK tuşuna basın.

DataGrip sizin için her şeyi halledecektir.


2
Unutmayın, DataGrip Ücretsiz Değil !
Rahmat Ali

0

PgAdmin (Backup:, pg_dumpRestore :) pg_restoredosyasını Windows'tan çalıştırırsanız, dosyayı varsayılan olarak çıktıya çıkarmaya çalışır c:\Windows\System32ve bu nedenle kullanıcı postgres yeterince yükseltilmediğinden değil, İzin / Erişim engellendi hatası alırsınız. PgAdmin'i Yönetici olarak çalıştırın veya çıktı için Windows'un sistem klasörleri dışında bir konum seçin.


0

Alternatif olarak, uzak veri tablolarınızı yabancı veri sarmalayıcı uzantısını kullanarak yerel tablolar olarak da açığa çıkarabilirsiniz. Daha sonra uzak veritabanındaki tablolardan seçim yaparak tablolarınıza ekleyebilirsiniz. Tek dezavantajı çok hızlı olmamasıdır.

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.