Ich versuche, eine ganze Tabelle in Postgres von einer Datenbank in eine andere zu kopieren. Irgendwelche Vorschläge?
Ich versuche, eine ganze Tabelle in Postgres von einer Datenbank in eine andere zu kopieren. Irgendwelche Vorschläge?
Antworten:
Extrahieren Sie die Tabelle und leiten Sie sie direkt an die Zieldatenbank weiter:
pg_dump -t table_to_copy source_db | psql target_db
Hinweis: Wenn in der anderen Datenbank die Tabelle bereits eingerichtet ist, sollten Sie das -a
Flag nur zum Importieren von Daten verwenden. Andernfalls werden möglicherweise seltsame Fehler wie "Nicht genügend Speicher" angezeigt:
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
Flag nur für Daten verwenden sollten, wenn in der anderen Datenbank die Tabelle bereits eingerichtet ist . dh pg_dump -a -t my_table my_db | psql target_db
. Während ich hier bin: Wenn sich Ihre Datenbank auf einem Server befindet, fällt es mir leichter, die Datenbank einfach in eine Datei zu kopieren und diese Datei dann in die Datenbank zu scp und dann den Inhalt der Datei an psql zu senden. zB pg_dump -a -t my_table my_db > my_file.sql
und nachdem Sie das auf Ihren Server gestellt haben ->psql my_other_db < my_file.sql
pg_dump -t '"tableToCopy"' source_db | psql target_db
. Beachten Sie, dass einfache und doppelte Anführungszeichen den Tabellennamen umgeben
Sie können die Sicherungsfunktion auch in pgAdmin II verwenden. Befolgen Sie einfach diese Schritte:
Funktioniert gut und kann mehrere Tabellen gleichzeitig erstellen.
Objects
Abschnitt auswählen . Klicken Sie unter OSX auf die Schaltfläche SQL oder rufen Sie SQL Editor
über das Tools
Menü das aus der Sicherungsdatei kopierte SQL ein.
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);
Verwenden von psql auf einem Linux-Host, der mit beiden Servern verbunden ist
( 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 ...
dann brauchen Sie nicht einmal explizite Subshells! Normalerweise sollten Sie zuerst ein paar Dinge tun, um sie einzurichten, sodass möglicherweise ohnehin Unterschalen erforderlich sind. Außerdem werden die Passwörter nicht in nachfolgende Prozesse exportiert. Vielen Dank!
pg_dump -t '<table_name>' --schema-only
Zuerst installieren dblink
Dann würden Sie so etwas tun wie:
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 bedeutet lokal, r ist remote. Escape einfache Anführungszeichen. Geben Sie Col-Typen an.)
Verwenden Sie pg_dump, um Tabellendaten zu sichern und sie dann mit psql wiederherzustellen.
Wenn Sie beide Remote-Server haben, können Sie folgende Schritte ausführen:
pg_dump -U Username -h DatabaseEndPoint -a -t TableToCopy SourceDatabase | psql -h DatabaseEndPoint -p portNumber -U Username -W TargetDatabase
Die erwähnte Tabelle der Quelldatenbank wird in die gleichnamige Tabelle der Zieldatenbank kopiert, sofern bereits ein Schema vorhanden ist.
Sie können Folgendes tun:
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>
Hier ist, was für mich funktioniert hat. Erster Speicherauszug in eine Datei:
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
Verwenden Sie den folgenden Befehl, um eine Tabelle in Ihrem lokalen Setup von Datenbank A in Datenbank B zu verschieben:
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>
bevor Sie den Befehl
Ich habe einige der Lösungen hier ausprobiert und sie waren wirklich hilfreich. Nach meiner Erfahrung ist die beste Lösung die Verwendung der psql- Befehlszeile, aber manchmal habe ich keine Lust, die psql-Befehlszeile zu verwenden. Hier ist 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 ihre Typen der Tabelle, die Sie kopieren möchten, geschrieben werden müssen.
pg_dump
funktioniert nicht immer.
Vorausgesetzt, Sie haben dieselbe Tabelle ddl in beiden dbs, können Sie 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"
Entspricht den Antworten von user5542464 und Piyush S. Wanare, ist jedoch in zwei Schritte unterteilt:
pg_dump -U Username -h DatabaseEndPoint -a -t TableToCopy SourceDatabase > dump
cat dump | psql -h DatabaseEndPoint -p portNumber -U Username -W TargetDatabase
Andernfalls werden die beiden Passwörter gleichzeitig von der Pipe abgefragt.
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 auszuführen.
Ich habe bereits einen ausführlichen Beitrag zu diesem Thema erstellt. Bitte besuchen Sie diesen Link
Ü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);
Wenn beide DBs (von & bis) kennwortgeschützt sind, fragt das Terminal in diesem Szenario nicht nach dem Kennwort für beide DBs. 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>
Ich habe DataGrip (von Intellij Idea) verwendet. und es war sehr einfach, Daten von einer Tabelle (in einer anderen Datenbank in eine andere) zu kopieren.
Stellen Sie zunächst sicher, dass Sie mit beiden DataSources in Data Grip verbunden sind.
Wählen Sie Quelltabelle und drücken Sie F5 oder (Klicken Sie mit der rechten Maustaste -> Wählen Sie Tabelle kopieren nach.)
Dies zeigt Ihnen eine Liste aller Tabellen (Sie können auch mit einem Tabellennamen im Popup-Fenster suchen). Wählen Sie einfach Ihr Ziel aus und drücken Sie OK.
DataGrip erledigt alles andere für Sie.
Wenn Sie pgAdmin (Backup : pg_dump
, Restore :) pg_restore
unter Windows ausführen , wird versucht, die Datei standardmäßig an auszugeben. Aus c:\Windows\System32
diesem Grund wird der Fehler "Berechtigung / Zugriff verweigert" angezeigt, und nicht, weil der Benutzer postgres nicht ausreichend erhöht ist. Führen Sie pgAdmin als Administrator aus oder wählen Sie einen anderen Speicherort für die Ausgabe als die Systemordner von Windows.
Alternativ können Sie Ihre Remote-Tabellen auch als lokale Tabellen mit der Erweiterung für fremde Daten-Wrapper verfügbar machen. 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.