it-swarm.com.de

Kopieren Sie eine Tabelle von einer Datenbank in eine andere in Postgres

Ich versuche, eine ganze Tabelle in Postgres von einer Datenbank in eine andere zu kopieren. Irgendwelche Vorschläge?

202
nix

Extrahieren Sie die Tabelle und leiten Sie sie direkt an die Zieldatenbank weiter:

pg_dump -t table_to_copy source_db | psql target_db
219
thomax

Sie können die Sicherungsfunktion auch in pgAdmin II verwenden. Folgen Sie einfach diesen Schritten:

  • Klicken Sie in pgAdmin mit der rechten Maustaste auf die Tabelle, die Sie verschieben möchten, und wählen Sie "Backup" aus.
  • Wählen Sie das Verzeichnis für die Ausgabedatei und setzen Sie das Format auf "plain".
  • Klicken Sie auf die Registerkarte "Dump Options # 1", aktivieren Sie "Nur Daten" oder "Nur Schema" (je nachdem, was Sie tun).
  • Klicken Sie im Abschnitt "Abfragen" auf "Spalteneinfügungen verwenden" und "Befehle zum Einfügen von Benutzern".
  • Klicken Sie auf die Schaltfläche "Backup". Dies wird in eine .backup-Datei ausgegeben
  • Öffnen Sie diese neue Datei mit dem Editor. Sie sehen die Einfügungsskripte, die für die Tabelle/Daten benötigt werden. Kopieren Sie diese und fügen Sie sie in die neue Datenbank-SQL-Seite in pgAdmin ein. Als pgScript ausführen - Abfrage-> Als pgScript ausführen F6

Funktioniert gut und kann mehrere Tabellen gleichzeitig ausführen. 

78
a2ron44

Die Verwendung von dblink wäre bequemer!

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);
63
tinychen

Verwenden Sie psql auf einem Linux-Host, der mit beiden Servern verbunden ist

( PGPASSWORD=password1 
  psql -U user1 -h Host1 database1 \
  -c "copy (select field1,field2 from table1) to stdout with csv" ) \
| 
( PGPASSWORD=password2 
  psql -U user2 -h Host2 database2 \ 
   -c "copy table2 (field1, field2) from stdin csv" )
22
Alexey Sviridov

zuerst installiere dblink

sie würden so etwas tun:

 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 
 );
17
user3946530

Verwenden Sie pg_dump, um Tabellendaten zu sichern, und stellen Sie sie dann mit psql wieder her.

13

Wenn Sie beide Remote-Server haben, können Sie Folgendes verfolgen:

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

Es wird die erwähnte Tabelle der Quellendatenbank in dieselbe benannte Tabelle der Zieldatenbank kopieren, sofern bereits ein Schema vorhanden ist. 

9

Folgendes funktionierte für mich . Zuerst in eine Datei kopieren:

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

laden Sie dann die abgelegte Datei:

psql -U myuser -d second_db</tmp/table_dump
7
max
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>

7

Verwenden Sie den folgenden Befehl, um eine Tabelle in Ihrem lokalen Setup von der Datenbank A in die Datenbank B zu verschieben:

pg_dump -h localhost -U Name des Inhabers -p 5432 -C -t Tabellenname Datenbank1 | psql -U Besitzername -h localhost -p 5432 Datenbank2

5
user5542464

pg_dump funktioniert nicht immer ... 

Angenommen, Sie haben die gleiche Tabelle ddl in den beiden dbs Sie können sie wie folgt von stdout und stdin hacken

 # 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"
4
Yordan Georgiev

Ich habe hier einige Lösungen ausprobiert und sie waren wirklich hilfreich. Nach meiner Erfahrung ist die beste Lösung die Befehlszeile psql , aber manchmal fühle ich mich nicht wie die Befehlszeile psql. Hier ist also eine andere Lösung für pgAdminIII

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 
  )
 )

Das Problem bei dieser Methode ist, dass der Name der Felder und die Typen der Tabelle, die Sie kopieren möchten, geschrieben werden müssen.

3
Eloy A

Entspricht den Antworten von user5542464 und Piyush S. Wanare , jedoch in zwei Schritten aufgeteilt

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

ansonsten fragt die Pipe die beiden Passwörter gleichzeitig.

3
Adobe

Sie müssen DbLink verwenden, um Tabellendaten in eine andere Tabelle in einer anderen Datenbank zu kopieren. Sie müssen die DbLink-Erweiterung installieren und konfigurieren, um eine datenbankübergreifende Abfrage ausführen zu können. 

Ich habe bereits einen ausführlichen Beitrag zu diesem Thema erstellt. Bitte besuchen Sie diesen Link

2
Anvesh

Wenn die beiden DBs (von & bis) kennwortgeschützt sind, werden Sie in diesem Szenario nicht nach dem Kennwort für beide DBs gefragt. Die Kennwortabfrage wird nur einmal angezeigt. Um dies zu beheben, übergeben Sie das Kennwort zusammen mit den Befehlen.

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

Überprüfen Sie dieses Python-Skript

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
themadmax

Alternativ können Sie Ihre entfernten Tabellen auch als lokale Tabellen verfügbar machen, indem Sie die Fremddaten-Wrapper-Erweiterung verwenden. Sie können dann in Ihre Tabellen einfügen, indem Sie aus den Tabellen in der entfernten Datenbank auswählen. Der einzige Nachteil ist, dass es nicht sehr schnell ist.

0
ThatDataGuy

Wenn Sie pgAdmin (Backup: pg_dump, Restore: pg_restore) von Windows aus ausführen, wird versucht, die Datei standardmäßig in c:\Windows\System32 auszugeben. Aus diesem Grund erhalten Sie den Berechtigungs-/Zugriffsverweigerungsfehler. Führen Sie pgAdmin als Administrator aus oder wählen Sie einfach einen anderen Speicherort als die Systemordner von Windows.

0
Imre