Frage PostgreSQL FEHLER: keine weiteren Verbindungen erlaubt


Wie befreien Sie PostgreSQL-Verbindungen, die nicht ordnungsgemäß von Client-Anwendungen geschlossen werden?

Ich habe eine Data-Mining-App, die mehrere Prozesse hochfährt, die alle mit einer lokalen PostgreSQL 9.1-Datenbank verbunden sind, um Daten abzurufen. Es läuft gut für ein paar Stunden, aber dann stirbt mit dem Fehler:

FATAL:  remaining connection slots are reserved for non-replication superuser connections

Die Untersuchung zeigt, dass dies höchstwahrscheinlich darauf zurückzuführen ist, dass die App ihre Verbindungen nicht ordnungsgemäß schließt. Diese Verbindungen werden jedoch selbst mit der getöteten App niemals freigegeben. Gibt es keine Art von Timeout, bei der PostgreSQL automatisch eine Verbindung schließt?

Ich habe auch versucht, Postgres max_connections von 100 auf 200 zu erhöhen, aber Neustart gab mir den Fehler:

2014-02-23 10:51:15 EST FATAL:  could not create shared memory segment: Invalid argument
2014-02-23 10:51:15 EST DETAIL:  Failed system call was shmget(key=5432001, size=36954112, 03600).
2014-02-23 10:51:15 EST HINT:  This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter.  You can either reduce the request size or reconfigure the kernel with larger SHMMAX.  To reduce the request size (currently 36954112 bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections.
    If the request size is already small, it's possible that it is less than your kernel's SHMMIN parameter, in which case raising the request size or reconfiguring SHMMIN is called for.
    The PostgreSQL documentation contains more information about shared memory configuration.

Mein System ist Ubuntu 12.04 und hat 8 GB Arbeitsspeicher, und alle anderen PG-Einstellungen sind Standardeinstellungen, weshalb ich nicht sicher bin, warum das System nicht genügend Arbeitsspeicher hat.

Ich versuchte dann, pgbouncer zu verwenden, um Verbindungen zu vereinigen und wiederzuverwenden. Dies schien ein wenig besser zu funktionieren, aber selbst das ging irgendwann aus den Verbindungen aus und gab mir den Fehler:

ERROR:  no more connections allowed

Wie kann ich dieses Problem weiter diagnostizieren und beheben?


19
2018-02-23 16:01


Ursprung


Zeige die Ausgabe von pg_stat_activity - ETL


Antworten:


Sie können die maximale Anzahl von Verbindungen erhöhen, indem Sie die Einstellungen für den maximalen gemeinsamen Speicher ändern. Wenn das Problem jedoch darin besteht, dass Ihre Verbindungen nicht geschlossen werden, sollten Sie dies wirklich beheben. Wenn die Software nicht in Ihrer Kontrolle ist und fehlerhaft ist, indem Sie keine Verbindungen schließen, können Sie einen Cron-Job wie:

select pg_terminate_backend(procpid)
from pg_stat_activity
where usename = 'yourusername'
 and current_query = '<IDLE>'
 and query_start < current_timestamp - interval '5 minutes'
;

Das ist, was ich tue, um undichte Verbindungen von einer ähnlichen Buggy-Software zu töten.

Alternativ können Sie Ihre Buggy-Software möglicherweise über einen Verbindungspool ausführen, der eine ähnliche Funktionalität zum Aufheben leerer Verbindungen wie pgpool bietet.

Hinweis: Neuere Versionen von Postgres haben leicht unterschiedliche Spaltennamen:

select pg_terminate_backend(pid)
from pg_stat_activity
where usename = 'YOURDATABASEUSERNAME*'
 and state = 'idle'
 and query_start < current_timestamp - interval '5 minutes'
;

8
2018-02-23 17:36



Sollte das am 9.6 funktionieren? Wenn ich es versuche, bekomme ich postgres=> select pg_terminate_backend(procpid) from pg_stat_activity where current_query = '<IDLE>' and query_start < current_timestamp - interval '5 minutes'; ERROR: column "procpid" does not exist LINE 1: select pg_terminate_backend(procpid) from pg_stat_activity ... - Magick
Es ist pid anstatt procpid in neueren Versionen. - ETL


Für neuere Versionen von PostgreSQL:

select pg_terminate_backend(pid)
from pg_stat_activity
where usename = 'YOURDATABASEUSERNAME*'
 and state = 'idle'
 and query_start < current_timestamp - interval '5 minutes'
;

Das obige hilft Ihnen, Ihre inaktiven Verbindungen zu beenden. Ich hatte das gleiche Problem, aber es stellte sich heraus, ein Problem mit meinem Flask und SQLAlchemy Weg zur Datenbank zu verbinden.

*Nutzername ist kein Tippfehler


4
2017-07-27 23:33





PG-Dokument beim Verwalten von Kernel-Ressourcen. Diese sollte Ihnen helfen, das Speicherlimit im Kernel zu erhöhen.


0
2018-02-23 17:06