COPY FROM mag nicht

Hallo,

ich habe hier eine Datenbank mit einer Tabelle, die so ein bisschen über 1 Mio Datensätze hat. Diese möchte ich nun in eine andere Tabelle einer anderen Datenbank kopieren. Dachte mir das geht ganz simpel mit

 COPY tabelle TO 'file.out';

und dann

 COPY neue_tabelle FROM 'file.out';

COPY … TO läuft super durch, auch bei 1 Mio Datensätzen. COPY … FROM jedoch findet 100.000 Datensätze wohl schon zuviel und reißt die Hufe hoch. Es passiert auch nach einer halben Stunde noch nix weiter. Mit 10 und auch 100 Datensätzen funzt das einwandfrei.

Hat jemand eine Idee, woran das liegen könnte? Die Datensätze sind nix besonderes. Auch nicht besonders groß. Einfacher Text, Datum und Zeit.

Gruß,
Leeloo5E

Hallo Leeloo5E,

schreibt doch mal den vollständigen Befehl!
Mit welchem Tool ausgeführt?
Sind Zeichen im Import, die nicht dem Zeichensatz SERVER_ENCODING oder CLIENT_ENCODING entsprechen?
Hast Du keine Meldung erhalten?



mfg

fristo

Hallo fristo,

danke für deine Antwort.
Der oben beschriebene Befehl ist schon alles was ich mache. Und nein, ich erhalte keine Meldung. Das ist ja das merkwürdige. Ich weiß nun nicht, ob er rödelt oder nicht. Laut HDD-Lämpchen nicht. Scheinbar tut er aber doch was. Hab meine Tabelle mal per SELECT INTO TEMPORARY in kleine Happen geteilt und jeweils dann COPY TO und in der andern DB COPY FROM gemacht. Bei Datei-Größen von um die 1 MB ist die Ausführzeit noch recht schnell. Bei 30 oder 40 MB dauerts schon so 15 - 20 Minuten. Tja, und die komplette Tabelle mit 1 Mio Datensätzen verursacht eine 230 MB große Datei. Ich denke mal daran liegts. Die Datei war einfach zu groß und PostgreSQL war immer noch dabei daran zu knabbern. Es hat also doch gerödelt und ich habs abgebrochen, weil ich dachte, der hat sich aufgehangen und macht nüscht. Naja, zum Glück is ja nix weiter passiert. Hoffe ich zumindest. Daten waren jedenfalls noch net in der Tabelle angekommen.
So eine Sicherheitsmeldung alle paar Minuten: Still Working … wäre schon net schlecht, wenn man sowas macht. Bei 230 MB schätze ich die Ausführungszeit so an die 3 h.
Ich hab allgemein das Gefühl, dass mein PostgreSQL 8.1.4 oder so lahm is. Mit einer 7er Version liefen Abfragen über eine vergleichbar große Tabelle wesentlich schneller ab. Gibts da irgendwelche Konfigurationeinstellung, die die DB beschleunigen? Ich nutze schon Indexe und hab auch VACUUM ANALYZE ausgeführt.

Gruß,
Leeloo5E

Hallo Leeloo5E,

wenn das HD-Lämpchen nicht blinkt, hängt mit Sicherheit der Befehl. Man sollte das aber anhand der CPU-Leistung sehen, ob da überhaupt eine Reaktion stattfindet. Was das jetzt genau ist, kann ich Dir auch nicht sagen. Irgendwelche Beiträge über große Probleme mit dem Copy-Befehl hat es auch nicht gegeben, und wenn, dann lag es am Syntax.

Eine Lösung wäre ein Backup von der Tabelle zu erstellen. Im Textmode kannst Du bestimmen, dass Du nur die Daten der Tabelle exportiert haben willst. Du arbeitest ja mit phpPgAdmin, das sollte die gleiche Funktionalität haben wie PgAdmin. Versuch es mal über diesem Weg. Den Import der Daten kannst Du ja auch mit phpPgAdmin starten. 3h sollte der Import aber nicht dauern.

Na ja, dass eine Datenbank lahm ist wird immer schnell behauptet. Die Gründe sind vielfältig, vom Design bis zur Hardware. Was Du machen solltest, ist erstmal ein VACUUM FULL auszuführen. Die Defragmentierung der HD spielt natürlich auch eine Rolle. Die SELECT’s solltest Du mit EXPLAIN untersuchen. Hier sieht man ganz schnell, wo ein großer zeitlicher Aufwand bei der Ausführung entsteht und kann dann die Befehle optimieren. Kapitel “Chapter 22. Routine Database Maintenance Tasks” sollte auch gelesen werden.

Ein Standardknöpfen für die Optimierung gibt es leider in der Conf nicht. Das ganze hängig auch von der Applikation ab. Die Conf zu ändern sollte einer der letzten Schritte sein. Die Parameter sind vielfältig, so dass man sich auch in die Doku einarbeiten muss.

Hier, http://www.powerpostgresql.com/Docs/, gibt es noch eine spezielle Seite für PostgreSQL-Optimierung, darunter auch eine Checkliste. Vielleicht findest Du da noch einige Anregungen.



mfg

fristo

Hallo Fristo,

vielen Dank für deine Antwort.

Mein PostgreSQL läuft in einer VMware unter SuseLinux 10.1. Ich hatte mich mal an phpPgAdmin versucht, bin aber schon am Einloggen gescheitert. Deshalb tipper ich jetzt immer brav in der Konsole im besagten Linux mit psql rum. Da hab ich auch besagte Befehle ausgeführt. Und die HD gibt ab und an mal nen Signal von sich, was ja normal ist. Wenn ich so ein Teil-Copy ausführe, dann haben meine CPUs schon ganz schön zu tun: bis 60 % Ausschlag. Ich arbeite aber nebenher noch in meinem Windows weiter.

Mit VACUUM und VACUUM ANALYZE hab ich auch ein paar ms rausholen können bei den SELECTs. Es dauert aber halt immer noch ziemlich lange … Leider. Ich werd mir jedoch mal die von dir empfohlene Literatur dazu zu Gemüte führen. Vielleicht find ich da ja was passendes, was die Angelegenheit etwas schneller macht.

Ich finds halt merkwürdig, dass die SELECTs unter einer Postgres 7er Version schneller liefen als unter einer 8er … Die Daten wurden 1:1 kopiert bzw. in diesem Fall gedumpt und eingespielt.

Na mal schaun, was ich tun kann.
Vielen Dank für deine Antworten.

Gruß,
Leeloo5E