Debugging SQL-Inserts

Hallo,

ich suche eine Möglichkeit, mir fehlerhafte Zeilen eines Inserts ausgeben zu lassen - wenn möglich aus psql heraus.
Hintergrund:
Beim Import von 300 000 Datensätzen tritt immer wieder ein Fehler auf und die Fehlermeldung sagt nicht, welcher Datensatz resp. bei welchem Insert das Problem auftritt. Hilfreich wäre, wenn die ID oder die Nummer des lfd. Inserts ausgegeben würde, an dem der Fehler auftritt.

Hat jemand einen Tipp?

Gruß
Rolf

Sagt das Log auch nichts?

Ansonsten würde ich vorschlagen, den Insert in Abschnitte zu unterteilen und somit die Stelle einzugrenzen.

Hallo ads,

Sagt das Log auch nichts?

Leider nein, ist ja auch kein Problem der Programme, sonder das Problem sitzt (mehr oder minder) vor der Tastatur.

Trotzdem Danke
Rolf

Schau genauer nach, und sag uns auch, wie der INSERT abläuft. Selbst bei einem COPY bekommt man reichlich Infos geliefert:

test=# create table foo (i int);
CREATE TABLE
Time: 110.421 ms
test=*# copy foo from stdin;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> 1
>> 2
>> 3
>> a
>> 5
>> 6
>> \.
ERROR:  invalid input syntax for integer: "a"
CONTEXT:  COPY foo, line 4, column i: "a"

Andreas

Hallo Andreas,

sag uns auch, wie der INSERT abläuft


  1. Ich mache ein “psql datenbank < file_mit_INSERT_Statements”
  2. dabei kommt über STDOUT für jeden erfolgreichen Eintrag: INSERT 0 1
  3. bei Fehlern (die hier Thema sind) über STDERR: ERROR: Invalide Byte Sequence for encoding “UTF8”:0x… HINT: This error can also happen…
  4. im /var/log/postges… keine zugehöriger Eintrag.

Das Problem ist die Zuordnung der Fehlerzeile zum INSERT-Statement - besonders wenn 170000 Inserts laufen und beim 100000. der Fehler auftritt.
Als Lösungsweg will ich heute versuchen die Meldungen von STDERR und STDOUT in eine Datei schreiben zu lassen, mir mit mittels grep die Zeilennummer der Fehlermeldung geben lassen um dann das entsprechende INSERT-Statement zu suchen. Ist recht aufwendig, da alles durch mehrere Skript resp. Filter laufen muss. Könnte mit hilfreichen Fehlermeldungen einfacher sein.

Gruß
Rolf

Bei der Menge an Daten würde ich ernsthaft prüfen, daß via COPY zu machen.
Wenn Du das alles via einzelner INSERT machst, weiß PG nicht, in welcher Zeile Deines file_mit_INSERT_Statements der Fehler passiert, es liest ja von STDIN und arbeitet das ab. Jeder INSERT ist dann ein Ding für sich und wenn es fertig ist, ist es eben Geschichte.

Ansonsten: man kann das Logging in /var/log/post… beeinflussen, so daß es fehlerhafte Statements komplett loggt. Dann hast Du dort das kapotte INSERT-Statement und kannst das zum greppen benutzen.

Andreas

Hallo Andreas,

vielen Dank für deine Tipps. Mit den Logging-Optionen muss ich mich noch beschäftigen.
Wäre gut, wenn ich nur die fehlerhaften INSERTS aufgelistet bekäme, könnte diese dann nachbearbeiten und noch einfügen - sind nicht viele (84 abgewiesene Inserts bei > 600000 erfolgreichen Inserts).

Leider kann ich die Daten nicht mit COPY einlesen, denn neben zwei Subselects fehlen mir auch Laufzeit-Infos über die Datenbank

Das Programm liest Daten von Datensicherungen ein mit allen Dateiattributen und weiteren Metadaten über den Sicherungslauf. Habe Daten von einer DVD mit 170818 Einträgen.

Danke und Gruß
Rolf