Haru Utils

DATABASE CONNECTIONS

PostgreSQL 연결 수가 초과되거나 접속이 거부될 때

네트워크·인증 오류와 connection slot 부족을 구분하고 사용자·애플리케이션·상태별 연결과 장기 트랜잭션을 확인합니다.
remaining connection slots are reservedtoo many clients alreadymax_connectionspg_stat_activityidle in transaction
환경PostgreSQL 14·15·16·17·18 · 관리자용 읽기 권한 또는 pg_read_all_stats
분류데이터베이스
검토일2026-08-27
진행5단계 · 조회 우선

SAFE OPERATING BOUNDARY

중단·복구 기준부터 확인하세요

STOP CONDITIONS

여기서는 멈추세요

  • 관리자용 예약 연결을 확보하지 못했거나 PID의 소유·트랜잭션 영향을 확인하지 못하면 세션을 종료하지 않습니다.
  • max_connections 상향은 메모리·재시작·standby 영향 검토 없이 적용하지 않습니다.
ROLLBACK

복구 기준

종료된 세션의 현재 트랜잭션은 복구할 수 없습니다. 변경 전 PID·쿼리 소유자 승인을 받고 애플리케이션 재시도·롤백 동작을 확인합니다.

ESCALATION PACK

담당자에게 전달할 자료

  • PostgreSQL 버전과 max_connections·예약 연결 설정 출처
  • 사용자·application_name·state별 연결 집계
  • 종료 후보의 PID·client_addr·xact_age와 조치 후 재발 여부
공식 문서와 읽기 전용 진단 명령을 우선 검토했습니다. 실제 서버에서는 설치된 버전의 --help와 man을 함께 확인하세요.

BEFORE YOU START

이런 증상에서 시작합니다

  • sorry, too many clients already
  • remaining connection slots are reserved
  • 새 애플리케이션 연결 실패
  • idle 또는 idle in transaction 연결 급증

CHECK THE BRANCH

놓치기 쉬운 원인 분기

01

pg_isready도 no response

연결 수보다 서버 기동, listen_addresses, 포트와 네트워크 경로를 먼저 확인합니다.

02

idle 연결이 많음

애플리케이션 풀의 최대 크기, 인스턴스 수와 유휴 연결 수명을 확인하고 DB 전체 max_connections를 먼저 올리지 않습니다.

03

idle in transaction이 오래됨

단순 idle과 달리 열린 트랜잭션이 락과 vacuum을 방해할 수 있으므로 소유 애플리케이션과 트랜잭션 시작 시각을 확인합니다.

FOLLOW THE FLOW

순서대로 확인하기

1
조회시스템을 변경하지 않는 확인 단계

서버 응답과 버전·연결 제한 확인

비밀번호를 명령행에 넣지 않고 서버 응답과 관리자 세션에서 설정값을 확인합니다.

서버 응답
pg_isready -h DB_HOST -p 5432
버전
sudo -u postgres psql -X -d postgres -c 'SELECT version();'
연결 제한
sudo -u postgres psql -X -d postgres -c "SHOW max_connections; SHOW superuser_reserved_connections;"
결과 읽기

no response는 네트워크·기동 문제이고, 서버는 응답하지만 일반 연결만 거부되면 slot 부족이나 인증 문제를 확인합니다.

다음 판단

관리자 연결 하나를 유지하고 설정값을 기록합니다.

2
조회시스템을 변경하지 않는 확인 단계

사용자·애플리케이션·상태별 연결 집계

쿼리 원문 대신 집계부터 확인해 민감한 SQL 노출을 줄입니다.

연결 상태 집계
sudo -u postgres psql -X -d postgres -c "SELECT datname, usename, application_name, state, count(*) AS connections FROM pg_stat_activity WHERE backend_type = 'client backend' GROUP BY datname, usename, application_name, state ORDER BY connections DESC;"
결과 읽기

한 application_name·사용자·DB가 대부분을 차지하는지와 active·idle·idle in transaction 비율을 확인합니다.

다음 판단

급증한 연결의 애플리케이션 소유자와 배포 시각을 연결합니다.

3
주의서버 부하나 권한을 고려할 단계

오래된 연결과 열린 트랜잭션 확인

query 열에는 개인정보나 비밀값이 포함될 수 있으므로 외부 공유 전 반드시 가립니다.

장기 idle transaction
sudo -u postgres psql -X -d postgres -c "SELECT pid, datname, usename, application_name, client_addr, now() - xact_start AS xact_age, left(query, 120) AS query FROM pg_stat_activity WHERE state = 'idle in transaction' ORDER BY xact_start NULLS LAST;"
역할별 연결 제한
sudo -u postgres psql -X -d postgres -c "SELECT rolname, rolconnlimit FROM pg_roles WHERE rolconnlimit >= 0 ORDER BY rolconnlimit;"
결과 읽기

xact_age가 길고 애플리케이션 요청과 무관한 세션은 연결 반환·트랜잭션 종료 오류 가능성이 있습니다.

다음 판단

종료 후보 PID의 사용자·클라이언트·현재 작업과 트랜잭션 영향을 확인합니다.

4
조회시스템을 변경하지 않는 확인 단계

현재 사용량과 설정 변경 영향 평가

max_connections 상향은 관련 공유 자원과 재시작을 요구하므로 즉시 해결책으로 사용하지 않습니다.

현재 연결과 최대값
sudo -u postgres psql -X -d postgres -c "SELECT count(*) FILTER (WHERE backend_type = 'client backend') AS client_connections, current_setting('max_connections')::int AS max_connections FROM pg_stat_activity;"
설정 출처
sudo -u postgres psql -X -d postgres -c "SELECT name, setting, source, sourcefile FROM pg_settings WHERE name IN ('max_connections','superuser_reserved_connections');"
결과 읽기

연결 수는 애플리케이션 인스턴스 수 × 풀 크기와 비교합니다. DB 설정보다 풀 상한과 연결 반환 문제를 우선 수정합니다.

다음 판단

긴급 종료가 필요한 PID와 지속 개선할 풀 설정을 분리합니다.

5
변경데이터·서비스 상태가 달라질 수 있는 단계

승인된 세션만 종료하고 연결 회복 검증

autovacuum·replication·관리자 세션이 아닌 확인된 client backend PID에만 적용합니다.

변경 단계입니다. 실행 전 대상 이름과 경로, 서비스 중단 영향, 복구 방법을 다시 확인하세요.
현재 쿼리 취소
sudo -u postgres psql -X -d postgres -c 'SELECT pg_cancel_backend(PID_NUMBER);'
승인된 세션 종료
sudo -u postgres psql -X -d postgres -c 'SELECT pg_terminate_backend(PID_NUMBER);'
세션의 열린 트랜잭션은 롤백되며 클라이언트가 재연결할 수 있습니다.
연결 수 재확인
sudo -u postgres psql -X -d postgres -c "SELECT state, count(*) FROM pg_stat_activity WHERE backend_type = 'client backend' GROUP BY state ORDER BY count(*) DESC;"
결과 읽기

새 연결이 회복되고 동일 애플리케이션에서 연결 수가 즉시 다시 증가하지 않아야 합니다.

다음 판단

재발하면 애플리케이션 풀·타임아웃과 트랜잭션 종료 코드를 수정합니다.

PRIMARY REFERENCES

공식 문서

배포판과 버전에 따라 옵션·로그 위치가 다를 수 있습니다. 실행 전 서버의 --help와 로컬 매뉴얼을 함께 확인하세요.

도구 빠른 검색

최근 사용한 도구를 다시 열거나, 이름과 기능으로 검색하세요.

검색어와 도구의 입력·결과는 저장하지 않습니다.

↑↓ 이동 · Enter 열기 · Esc 닫기