Ich habe ein Migrationsskript geschrieben, das auf sqlite funktioniert, aber wenn ich versuche, dasselbe auf postgres anzuwenden, bleibt es für immer hängen. Mit einem einfachen ps kann ich die Postres auf "create table waiting" sehen. Gibt es Best Practices?
Wenn es wirklich an einem Schloss hängt, müssen Sie sehen, worauf es wartet. Es wäre ziemlich komisch, wenn CREATE TABLE
in einem Schloss steckt, aber es ist nicht unmöglich.
Erhalte die Prozess-ID des wartenden Backends. Sie finden es in ps
oder in SELECT
ing von pg_stat_activity
und suchen nach Prozessen mit waiting
true, um den Befehl zu finden, an dem Sie interessiert sind:
Sehen Sie sich die Sperre an, auf die die festgefahrene PID wartet, indem Sie pg_locks
:
Sie können diese beiden Schritte kombinieren mit:
%Vor% Sehen Sie sich die Ergebnisse an oder verwenden Sie einen LIKE
-Filter für das Feld s.query
, um die Abfrage zu finden, für die Sie Sperrprobleme identifizieren möchten.
Sie können nun pg_locks
abfragen, um herauszufinden, welche Prozesse diese Sperre finden und was sie tun.
Angenommen, wir haben festgestellt, dass create
auf eine locktype = relation
lock of mode = AccessExclusiveLock
auf relation = 14421
gewartet hat. Wir möchten Sperren finden, die von anderen Sitzungen in dieser Beziehung gehalten werden:
Dies sollte Ihnen sagen, was das Erstellen blockiert.
Es gibt eine praktische Abfrage zur Sperrüberwachung im PostgreSQL Wiki , aber es werden nur Zeilensperren gefunden Also ist es im Allgemeinen nicht hilfreich für DDL.
Außerdem habe ich absichtlich nicht die ganze Menge in einer einzigen Abfrage kombiniert. Es wäre einfach genug, im Falle einer AccessExclusiveLock Lock Holder zu finden, die ein bestimmtes Backend mit pid blockieren, aber für schwächere Lock-Anfragen ist es nicht so einfach - ich müsste die Regeln aufstellen, mit welchen Locks diese in Konflikt stehen in SQL, und das ist ziemlich kompliziert. Es ist besser, es nur zu sehen.
Ihre Datenbank wird höchstwahrscheinlich durch eine andere Abfrage gesperrt.
Besonders wenn Sie mit ihrer GUI pgAdmin stopfen, kann dies sehr oft passieren. (Das Abschneiden von Tabellen ist besonders schwierig, manchmal stürzt pgAdmin ab und die Datenbank bleibt hängen)
Was Sie tun möchten, ist den PostgreSQL-Dienst neu zu starten und es erneut zu versuchen.
Stellen Sie sicher, dass Sie:
Tags und Links python postgresql alembic