PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Postgres-Client stürzt beim Erstellen einer neuen Tabelle ab

Wenn ein Neustart von Postgres eine Option ist, wird das Problem höchstwahrscheinlich gelöst und Sie sparen Zeit beim Lesen des Rests dieser Antwort :-)

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

select * from pg_stat_activity 
where 
wait_event_type is NULL and xact_start is not NULL order by xact_start;

(die pg_stat_activity wird in jeder größeren pg-Veröffentlichung ein wenig geändert, versuchen Sie dies für ältere Versionen):

select * from pg_stat_activity 
where 
not waiting and xact_start is not NULL order by xact_start;

Die erste Reihe, die auftaucht, ist wahrscheinlich diejenige, die Probleme verursacht. Es handelt sich oft um eine "inaktive Transaktion" - dies kann sehr wohl Sperren enthalten, und wenn es sich um eine alte Transaktion handelt, kann dies auch die Leistung beeinträchtigen. Wahrscheinlich hat der Programmierer vergessen, die Transaktion mit "commit" oder "rollback" zu beenden, oder vielleicht ist eine db-Sitzung aufgrund von Netzwerkproblemen hängen geblieben.

Um die Transaktion mit PID 1234 zu beenden, verwenden Sie select pg_cancel_backend(1234); , wenn das fehlschlägt, select pg_terminate_backend(1234) . Beim Shell-Zugriff lauten die entsprechenden Befehle kill -INT 1234 und kill 1234 . (Denken Sie daran, kill -9 1234 ist eine wirklich schlechte Idee).

Es gibt auch eine Ansicht pg_locks was einen Einblick geben kann, obwohl es wahrscheinlich nicht so einfach ist, nützliche Informationen daraus zu bekommen. Wenn granted wahr ist, wird die Sperre gehalten, wenn granted falsch ist, bedeutet dies, dass die Abfrage auf die Sperre wartet. Hier sind einige weitere Hinweise, wie man nützliche Informationen aus pg_locks extrahiert:http://wiki.postgresql. org/wiki/Lock_Monitoring

Wenn alles andere fehlschlägt, ist es wahrscheinlich an der Zeit, sich für die einfache Lösung zu entscheiden und den Datenbankserver neu zu starten.