Postgresql bleibt bei einem Statement stehen

Hallo Postgresql-Community!

Ich bin neu hier und hoffe, jemand kann mir weiterhelfen.

Postgresql 9.1.13 auf RHEL 6.5, 96 GB RAM

Bei einem Update unserer Software wird in der Datenbank heftig mit INSERT/UPDATE/DELETEs umgebaut.

Wir hatten mehrfach folgenden Vorfall:

  • Die Statements (siehe COOSVC7-2181.100-upgr100log.txt im Logfiles-ZIP) laufen alle in angemessener Zeit.
  • Bei einem DELETE-Statement (die letzte Zeile dieses Logs), das normalerweise nur wenige Sekunden dauert, liefert PostgreSQL plötzlich keine Rückmeldung mehr. Wenn man wartet, kommt das Statement nach über 5 Stunden erfolgreich zurück.
  • Führen wir NICHT den gesamten Migrationsprozess durch, laufen die Statements alle normal durch. Kaum aber lief unsere komplette “Migration”, haben wir wieder diese Hänger.
  • Während der Wartezeit haben wir dann auch mal EXPLAIN ANALYSE dieses Statements ausgeführt - die betroffenen Objekte sind nicht mehr vorhanden, das EXPLAIN ANALYSE des Statements dauerte unter 1 Sekunde

Wir haben bei PostgreSQL alle möglichen Logoptionen aktiviert, inkl. des Queryplan-Loggings. Im Log ist zu sehen, dass das Query einfach nicht fertig wird. Wir haben es dann abgebrochen (SELECT pg_cancel_backend(23369);), wo auch angezeigt wurde, dass unser Query erfolgreich abgebrochen wurde.
Unser Postgresql.conf habe ich auch angehängt.

Ich muss zugeben, dass ich mich mit der Logausgabe zu wenig auskenne. Wäre jemand so nett, das mal anzuschauen?
Einfach von unten nach oben suchen nach
DELETE FROM atintval a WHERE attrid = 285774255933167 AND EXISTS (SELECT 1 FROM atobjval b WHERE a.objid = b.objid AND b.attrid = 4226423930200364 AND a.aggrid = b.aggrid AND a.lineid = b.lineid AND objval = 281479288460325 )
Da findet man zuerst das Abbrechen der Query, dann das EXPLAIN ANALYSE und davor den tatsächlichen Aufruf des Statements. In normalen Läufen dauert das DELETE eine Sekunde, wir haben es nach ca. 45 Min. abgebrochen.

Ich danke allen, die sich die Mühe machen, mir einen Tipp zu geben.
Christian
postgresql.zip (1.24 KB)
Logs-2014-09-13.zip (168 KB)

Schau mal, ob da was in pg_locks steht. Die Spalte relation da ist die OID, diese findest Du in pg_class und dort wiederum den Namen der Tabelle. Also, wenn das mal wieder ‘hängt’, dann da schauen.

Hallo akretschmer,
danke für den Tipp - das hatten wir geprüft - keine Locks.
Interessant ist auch, dass im Log bei jedem funktionierenden Statement erst der Calculated Plan, und dann der tatsächliche Execution Plan protokolliert wird. Bei dem Problemstatement wird nicht einmal der Calculated Plan protokolliert.
lg, Christian