PostgreSQL 오류 : 더 이상 연결이 허용되지 않습니다


19

클라이언트 응용 프로그램에서 올바르게 닫히지 않은 PostgreSQL 연결을 어떻게 해제합니까?

다중 프로세스를 회전시키는 데이터 마이닝 앱이 있습니다. 모든 데이터를 로컬 PostgreSQL 9.1 데이터베이스에 연결하여 데이터를 검색합니다. 몇 시간 동안 정상적으로 실행되지만 오류와 함께 사망합니다.

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

이것을 조사하면 앱이 연결을 제대로 닫지 않았기 때문에 발생했을 가능성이 높습니다. 그러나 앱이 종료 된 경우에도 이러한 연결은 해제되지 않습니다. PostgreSQL이 자동으로 연결을 닫는 일종의 시간 초과가 있습니까?

또한 Postgres의 max_connections를 100에서 200으로 늘리려 고 시도했지만 다시 시작하면 오류가 발생했습니다.

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.

내 시스템은 Ubuntu 12.04이며 8GB의 메모리가 있으며 다른 모든 PG 설정이 기본값이므로 시스템에 충분한 메모리가 없다고 생각하는 이유를 모르겠습니다.

그런 다음 pgbouncer를 사용하여 연결을 풀링하고 재사용하려고했습니다. 이것은 조금 더 잘 작동하는 것처럼 보이지만 결국에는 연결이 부족하여 오류가 발생했습니다.

ERROR:  no more connections allowed

이 문제를 더 진단하고 수정하려면 어떻게합니까?


ETL

답변:


8

최대 공유 메모리 설정을 변경하여 최대 연결 수를 늘릴 수 있지만 연결이 닫히지 않은 문제인 경우 실제로 해결해야합니다. 소프트웨어가 제어 할 수없고 연결을 닫지 않아 버그가있는 경우 다음과 같은 cron 작업을 사용할 수 있습니다.

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

그것이 비슷한 버그가있는 소프트웨어에서 누수 된 연결을 끊기 위해하는 일입니다.

또는 pgpool과 같은 유휴 연결을 종료하는 비슷한 기능을 가진 연결 풀을 통해 버기 소프트웨어를 실행할 수 있습니다.

참고 : 최신 버전의 Postgres에는 약간 다른 열 이름이 있습니다.

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

9.6에서 작동해야합니까? 내가 시도하면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

그것은의 pid대신 procpid최신 버전입니다.
ETL

4

최신 버전의 PostgreSQL :

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

위의 내용은 유휴 연결을 종료하는 데 도움이됩니다. 나는 같은 문제가 있었지만 데이터베이스에 연결하는 Flask 및 SQLAlchemy 방법에 문제가있는 것으로 나타났습니다.

* usename은 오타가 아닙니다


0

커널 자원 관리에 관한 PG 문서 . 커널에서 메모리 제한을 늘리는 데 도움 됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.