Alembic-Migration mit postgresql stecken?

8

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?

    
tapioco123 06.04.2014, 16:08
quelle

3 Antworten

19

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 blockierte Prozess-ID

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:

%Vor%

Finde heraus, auf welche Sperre es wartet

Sehen Sie sich die Sperre an, auf die die festgefahrene PID wartet, indem Sie pg_locks :

abfragen %Vor%

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.

Finde heraus, wer diese Sperre hält

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:

%Vor%

Dies sollte Ihnen sagen, was das Erstellen blockiert.

Falten

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.

    
Craig Ringer 07.04.2014 02:54
quelle
3

Sie können postgresql immer neu starten.

    
Yuras 10.03.2016 15:43
quelle
1

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:

  1. Minimiere die Verwendung der GUI pgadmin
  2. Schließen Sie Ihre Cursor / dbs mit psycopg2, wenn Sie sie nicht brauchen
Retozi 06.04.2014 16:26
quelle

Tags und Links