Ergebnis 1 bis 7 von 7

Thema: Debugging SQL-Inserts

  1. #1
    rolfS ist offline Benutzer
    Registriert seit
    14.04.2006
    Ort
    Frankfurt
    Beiträge
    53

    Standard 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

  2. #2
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.055

    Standard

    Sagt das Log auch nichts?

    Ansonsten würde ich vorschlagen, den Insert in Abschnitte zu unterteilen und somit die Stelle einzugrenzen.
    Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören

    Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

    PostgreSQL Service & Support

  3. #3
    rolfS ist offline Benutzer
    Registriert seit
    14.04.2006
    Ort
    Frankfurt
    Beiträge
    53

    Standard

    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

  4. #4
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.465

    Standard

    Zitat Zitat von rolfS Beitrag anzeigen
    Hallo ads,


    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:

    Code:
    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
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  5. #5
    rolfS ist offline Benutzer
    Registriert seit
    14.04.2006
    Ort
    Frankfurt
    Beiträge
    53

    Standard

    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

  6. #6
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.465

    Standard

    Zitat Zitat von rolfS Beitrag anzeigen
    Hallo Andreas,

    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.

    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
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  7. #7
    rolfS ist offline Benutzer
    Registriert seit
    14.04.2006
    Ort
    Frankfurt
    Beiträge
    53

    Standard

    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

Ähnliche Themen

  1. pg_dump option inserts
    Von MisterX im Forum Allgemeines
    Antworten: 1
    Letzter Beitrag: 09.06.2010, 08:39
  2. Frage id/record eines inserts
    Von traxanos im Forum PL/pgSQL
    Antworten: 3
    Letzter Beitrag: 17.06.2009, 10:50
  3. Postgresql Tuning - Viele konkurriende Inserts
    Von floriannn im Forum Konfiguration
    Antworten: 1
    Letzter Beitrag: 17.07.2007, 18:10

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum