Program Tip

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

programtip 2020. 10. 11. 11:14
반응형

유휴 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 (밀리 초)

참고 URL : https://stackoverflow.com/questions/13236160/is-there-a-timeout-for-idle-postgresql-connections

반응형