Postgres bir veritabanından diğerine tüm tablo kopyalamaya çalışıyorum. Baska öneri?
Postgres bir veritabanından diğerine tüm tablo kopyalamaya çalışıyorum. Baska öneri?
Yanıtlar:
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, -a
bayrağı 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
pg_dump -U remote_user -h remote_server -t table_to_copy source_db | psql target_db
-a
bayrağı 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.sql
ve bunu sunucunuza koyduktan sonra ->psql my_other_db < my_file.sql
pg_dump -t '"tableToCopy"' source_db | psql target_db
. Tablo adını tek VE çift tırnak işaretleri içine
Yedekleme işlevini pgAdmin II'de de kullanabilirsiniz. Şu adımları uygulamanız yeterlidir:
İyi çalışır ve bir kerede birden fazla tablo yapabilir.
Objects
Bö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 Editor
için Tools
menüyü edinin .
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);
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" )
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!
pg_dump -t '<table_name>' --schema-only
İ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
);
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.
Tablo verilerinin dökümünü almak için pg_dump komutunu kullanın ve ardından psql ile geri yükleyin.
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.
Aşağıdakileri yapabilirsiniz:
pg_dump -h <host ip address> -U <host db user name> -t <host table> > <host database> | psql -h localhost -d <local database> -U <local db user>
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
export PGPASSWORD=<passw>
komutu çalıştırmadan önce yapabilirsiniz
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.
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"
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.
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
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);
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>
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.
PgAdmin (Backup:, pg_dump
Restore :) pg_restore
dosyasını Windows'tan çalıştırırsanız, dosyayı varsayılan olarak çıktıya çıkarmaya çalışır c:\Windows\System32
ve 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.
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.