Postgres-Client blockiert beim Erstellen einer neuen Tabelle

7

Ich versuche, eine neue Tabelle in Postgres zu erstellen, aber wenn ich es tue, hängt es nur nach dem CREATE TABLE -Aufruf.

%Vor%

Es wird dann nur noch unbestimmt hier sitzen bis ich CTRL-C it.

Es gibt andere Tabellen in der Datenbank und diese existiert noch nicht:

%Vor%

Ich kann problemlos Abfragen in andere Tabellen in der Datenbank einfügen und löschen:

%Vor%

Auf dem Gerät ist viel Platz:

%Vor%

Irgendwelche Ideen, was könnte falsch sein?

    
Mark L 03.07.2012, 07:47
quelle

2 Antworten

18

Überprüfen Sie die pg_stat_activity -Ansicht, da wahrscheinlich eine andere Transaktion die Schemaänderung blockiert.

%Vor%

Die erste Zeile, die angezeigt wird, ist wahrscheinlich die, die Probleme verursacht. Es ist oft ein "Leerlauf in der Transaktion" - dies kann sehr gut Sperren halten, und wenn es eine alte Transaktion ist, kann es auch Leistung zu töten. Wahrscheinlich hat der Programmierer vergessen, die Transaktion mit "commit" oder "rollback" zu beenden, oder vielleicht ist eine db session aufgrund von Netzwerkproblemen hängen geblieben.

Um die Transaktion mit pid 1234 zu beenden, verwenden Sie select pg_cancel_backend(1234); oder (von der Shell) kill 1234 . Wenn das fehlschlägt, lesen Sie Ссылка

Es gibt auch eine Ansicht pg_locks , die einen Einblick geben kann, obwohl es wahrscheinlich nicht so einfach ist, nützliche Informationen daraus zu erhalten. Wenn granted wahr ist, wird die Sperre gehalten. Wenn granted falsch ist, bedeutet dies, dass die Abfrage auf die Sperre wartet. Hier sind einige Tipps, wie man nützliche Informationen aus pg_locks extrahiert: Ссылка

Wenn alles andere fehlschlägt, sollte das Neustarten von postgres alle Sperren (sowie lang andauernde Transaktionen) löschen.

    
tobixen 03.07.2012, 08:03
quelle
4

Dies wird in diesem Thread erklärt; Ссылка

Laut Tom Lane

Diese create-Operation verweist auf die Tabelle auth_user, und PostgreSQL sollte Trigger zu beiden Tabellen hinzufügen. Wenn also eine lang andauernde (wahrscheinlich im Leerlauf befindliche) offene Transaktion vorliegt, die die AccessShare-Sperre für auth_user-Postgres hält, ist sie blockiert, während sie darauf wartet, dass dieser xact seine Sperre beendet und freigibt. Alles andere steht hinter dem Create.

Dieser PostgreSQL Mail-Thread ist ein guter Lesevorgang.

    
fsniper 05.03.2014 14:27
quelle

Tags und Links