Wie am schnellsten ca. 17millionen datensätze kopieren?

hallo,

ich stehe vor dem problem einen teil einer datenbank, bestehend aus 6tabellen
mit einem inhalt von ca.17millionen datensätzen von einer postgreDB in eine andere zu schaufeln.

beide DBs laufen auf unterschiedlichen maschinen.

wie kann ich das am schnellsten bewerkstelligen?

danke euch

Prinzipiell mit COPY, wenn beides *NIX-Maschinen sind und Netzwerk dazwischen ist vielleicht noch die Netzkatze bemühen (netcat), gibt es aber wohl auf für Fenster.


Andreas

beides win maschinen.
der eine ein server, 2000
der andere wesenlich schnellere ist eine win7 installation.

ich bin nicht sher bewandert mit postgres.

dieses copy ist ein cmd befehl nehme ich mal an?

Nein. Du startest psql und gibst ein:

test=*# copy t1 to '/tmp/t1.sql';
COPY 3

Tabelle hat halt nur 3 Records :wink:

Du hast dann in /tmp/t1.sql eine Datei, die Du auf der anderen Seite wieder ähnlich reinbekommst, mit copy t1 from … Das machst Du mit Deinen Tabellen.

Willst Du nur bestimmte Datensätze, dann copy (select … where …) to …


Prinzip verstanden? Falls nein: Doku lesen.


Andreas

prinzip ist klar.
also per console das ganze.

momentane situation:
sitze am *schnellen rechner, wo lokal auch die ziel postgresDB liegt.

auf den quellserver greife ich via Navicat zu. kann dort auch eine konsole öffnen.
wie kann ich nun, von dem quellserver per copy eine datei zum import auf dem *schnellen rechner erzeugen?

geht das überhaupt mit diesem copy befehl? also auch übers netz?

Du kannst auch vom Zielserver aus dies tun: (geht zumindest so unter richtigen OS)

psql -h <alter_server> alte_datenbank -c ‘\copy table to stdout’ | psql neue_datenbank -c ‘\copy table from stdin’

(ungetestet jetzt …)


Andreas

hmm

ginge das hier? :

copy tabelle001 to \rechner\Data_Swap\tabelle001.sql (\rechner\Data_Swap\ ist der lokale rechner mit sicht aus dem netzwerk auf ihn)
auf der quellDB bin ich via navicat drauf, habe über navicat eine console auf er quellDB geöffnet.

wenn ich nun diese befehlszeile abschicke, dann passiert nichts…!?

dh. ein “->” kommt, was da bedeuten mag?

Ich kenn Navicat nicht, und vermutlich fehlen in Deinem Befehl Quoting-Zeichen. Warum probierst nicht das aus, was ich gesagt habe? psql kann mittels -h auch auf Remote-Datenbanken arbeiten, \copy würde dann aber lokal nach stdout schreiben, das wiederum kannst Du in ein anderes psql, welches lokal zur Zieldatenbank verbunden ist, reinPIPEn.

Andreas

ok,

eben hiermit probiert:

psql -h quellrechner altedb -c ‘\copy tabelle to stdout’ | psql lokaledb -c ‘\copy tabelle from stdin’

nicht passiert, dh. zeitgleich erscheint -> darunter.
ich gehe einmal davon aus das nichts kopiert wird.
auch die zieldb ist ohne weitere einträge.

?

psql -h localhost test -c “\copy t1 to ‘stdout’” | psql -x test2 -c “\copy t1 from ‘stdin’”

Das eben lief, von einer DB zur anderen auf demselben Rechner, geht aber so prinzipiell auch übers Netz. Wichtig ist richtiger Einsatz von ’ und ".


Andreas

ok,

eben dieses probiert:

psql -h backuppa pa -c “\copy v_belegposvert to ‘stdout’” | psql -x LocalPostgres -c “\copy v_belegposvert from ‘stdin’”

kein erfolg, steckt evtl. ein fehler in meinem batch?

Kein Erfolg ist keine Fehlermeldung. Klappt der erste Teil, also bis zum PIPE-Zeichen? Kannst Du überhaupt via Netzwerk auf die andere DB zugreifen?


etwas Eigeninitiative wäre nicht schlecht …


Andreas

die *Eigeninitiative ginge dann besser, wenn ich mich in der materie besser auskennen würde.
dies ist meine erste berührung mit postgresql.

leider bekomme ich keinerlei meldungen, über einen (teil)erfolg oder misserfolg, innerhalb der console… !?