여기서는 멈추세요
- 관리자용 예약 연결을 확보하지 못했거나 PID의 소유·트랜잭션 영향을 확인하지 못하면 세션을 종료하지 않습니다.
- max_connections 상향은 메모리·재시작·standby 영향 검토 없이 적용하지 않습니다.
DATABASE CONNECTIONS
SAFE OPERATING BOUNDARY
종료된 세션의 현재 트랜잭션은 복구할 수 없습니다. 변경 전 PID·쿼리 소유자 승인을 받고 애플리케이션 재시도·롤백 동작을 확인합니다.
BEFORE YOU START
CHECK THE BRANCH
연결 수보다 서버 기동, listen_addresses, 포트와 네트워크 경로를 먼저 확인합니다.
애플리케이션 풀의 최대 크기, 인스턴스 수와 유휴 연결 수명을 확인하고 DB 전체 max_connections를 먼저 올리지 않습니다.
단순 idle과 달리 열린 트랜잭션이 락과 vacuum을 방해할 수 있으므로 소유 애플리케이션과 트랜잭션 시작 시각을 확인합니다.
FOLLOW THE FLOW
비밀번호를 명령행에 넣지 않고 서버 응답과 관리자 세션에서 설정값을 확인합니다.
pg_isready -h DB_HOST -p 5432sudo -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 부족이나 인증 문제를 확인합니다.
관리자 연결 하나를 유지하고 설정값을 기록합니다.
쿼리 원문 대신 집계부터 확인해 민감한 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 비율을 확인합니다.
급증한 연결의 애플리케이션 소유자와 배포 시각을 연결합니다.
query 열에는 개인정보나 비밀값이 포함될 수 있으므로 외부 공유 전 반드시 가립니다.
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의 사용자·클라이언트·현재 작업과 트랜잭션 영향을 확인합니다.
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와 지속 개선할 풀 설정을 분리합니다.
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와 로컬 매뉴얼을 함께 확인하세요.