[postgresql] 유휴 PostgreSQL 연결에 대한 시간 초과가 있습니까?

1 S postgres  5038   876  0  80   0 - 11962 sk_wai 09:57 ?        00:00:00 postgres: postgres my_app ::1(45035) idle
1 S postgres  9796   876  0  80   0 - 11964 sk_wai 11:01 ?        00:00:00 postgres: postgres my_app ::1(43084) idle

나는 그것들을 많이 본다. 우리는 연결 누출을 수정하려고합니다. 그러나 한편, 이러한 유휴 연결에 대한 제한 시간을 최대 5 분으로 설정하려고합니다.



답변

풀링 된 연결을 닫지 못하기 때문에 응용 프로그램에서 연결 누수 가있는 것 같습니다 . 세션 에만 문제가있는 것이 아니라 전체적으로 너무 많은 연결이 있습니다.<idle> in transaction

연결을 끊는 것은 정답이 아니지만 괜찮은 임시 해결 방법입니다.

PostgreSQL 데이터베이스에서 다른 모든 연결을 부팅하기 위해 PostgreSQL을 다시 시작하는 대신 Postgres 데이터베이스에서 다른 모든 사용자를 분리하려면 어떻게합니까?를 참조하십시오. 그리고 활성 연결이있는 경우 PostgreSQL 데이터베이스를 삭제하는 방법은 무엇입니까? . 후자는 더 나은 쿼리를 보여줍니다.

시간 제한을 설정하려면 @Doon이 제안했듯이 PostgreSQL에서 유휴 연결을 자동으로 닫는 방법을 참조하십시오 . , PgBouncer를 사용하여 PostgreSQL을 프록시하고 유휴 연결을 관리하는 것이 좋습니다. 어쨌든 연결이 누출되는 버그가있는 응용 프로그램이있는 경우 이것은 매우 좋은 생각입니다. 나는 매우 강력 PgBouncer을 구성하는 것이 좋습니다.

TCP의 킵 얼라이브는 응용 프로그램이 여전히 연결되어 살아 있기 때문에, 그냥 안, 여기에 일을하지 않습니다.

PostgreSQL 9.2 이상에서는 새 state_change타임 스탬프 열과의 state필드 pg_stat_activity를 사용하여 유휴 연결 리퍼를 구현할 수 있습니다. 크론 작업을 다음과 같이 실행하십시오.

SELECT pg_terminate_backend(pid)
    FROM pg_stat_activity
    WHERE datname = 'regress'
      AND pid <> pg_backend_pid()
      AND state = 'idle'
      AND state_change < current_timestamp - INTERVAL '5' MINUTE;

이전 버전에서는 연결이 유휴 상태가 된시기를 추적하는 복잡한 체계를 구현해야합니다. 귀찮게하지 마십시오. pgbouncer를 사용하십시오.


답변

PostgreSQL 9.6에는 idle_in_transaction_session_timeout설명을 수행해야하는 새로운 옵션 이 있습니다. 다음 SET과 같은 명령을 사용하여 설정할 수 있습니다 .

SET SESSION idle_in_transaction_session_timeout = '5min';


답변

PostgreSQL 9.1에서 다음 쿼리로 유휴 연결. 데이터베이스를 다시 시작해야하는 상황을 방지하는 데 도움이되었습니다. 이것은 주로 JDBC 연결이 열리고 제대로 닫히지 않은 경우 발생합니다.

SELECT
   pg_terminate_backend(procpid)
FROM
   pg_stat_activity
WHERE
   current_query = '<IDLE>'
AND
   now() - query_start > '00:10:00';


답변

postgresql 9.6 이상을 사용하는 경우 postgresql.conf에서 다음을 설정할 수 있습니다.

idle_in_transaction_session_timeout = 30000 (밀리 초)


답변

외부 예약 작업없이 데이터베이스 세션 시간 초과를 활성화 할 수있는 가능한 해결 방법 은 내가 개발 한 확장 pg_timeout 을 사용하는 입니다.


답변