Max Connection 오류 발생 후 Supabase PostgreSQL 연결 관리

Kim jisu·2025년 2월 27일
0

 Debugging Note

목록 보기
17/37

서비스 운영 중 max connection 오류가 발생하여 원인을 파악하고 해결하는 과정을 진행했습니다.
Supabase 기반인 PostgreSQL에서 연결 상태를 점검하고, 불필요한 idle 연결을 종료하는 방법에 대해 정리.


1. Max Connection 오류란?

PostgreSQL은 동시에 처리할 수 있는 최대 연결 수를 제한합니다. 이 제한을 초과하면 서비스에 연결할 수 없게 되어 max connection 오류가 발생합니다. 이 오류는 장시간 사용하지 않는 idle 연결들이 누적되거나, 애플리케이션에서 연결 관리를 적절히 하지 않을 때 나타날 수 있습니다.


2. PostgreSQL 연결 상태 확인 쿼리

문제의 원인을 파악하기 위해 우선 PostgreSQL 서버에 정상적으로 연결되어 있는지 확인해야 합니다. 아래와 같은 기본 SQL 쿼리들을 사용할 수 있습니다.

2.1 버전 및 데이터베이스 확인

서버와의 연결이 정상적인지 확인하기 위해 다음 쿼리로 PostgreSQL 버전과 현재 데이터베이스 이름을 조회합니다.

SELECT version();
SELECT current_database();

이 두 쿼리를 통해 서버와의 연결이 문제없이 이루어지고 있는지, 현재 어떤 데이터베이스에 연결되어 있는지를 알 수 있습니다.

2.2 간단한 연결 테스트

연결이 정상인지 단순히 테스트하기 위해 다음 쿼리를 실행할 수 있습니다.

SELECT 1;

쿼리가 에러 없이 실행된다면 연결 상태에는 문제가 없음을 의미합니다.

2.3 활성 연결 상태 확인

현재 데이터베이스에 어떤 세션들이 연결되어 있는지 확인하기 위해 아래 쿼리를 사용할 수 있습니다.

SELECT * FROM pg_stat_activity WHERE datname = current_database();

이 쿼리는 현재 데이터베이스의 모든 연결 상태를 보여주며, 각 세션의 상태(state) 정보를 확인할 수 있습니다.


3. Idle 연결 종료하기

max connection 오류의 주된 원인 중 하나는 장시간 idle 상태로 유지되는 연결들입니다. 이 경우 불필요한 idle 연결을 종료하여 연결 수를 줄일 수 있습니다.

3.1 Idle 연결 종료 SQL

현재 데이터베이스에서 idle 상태인 연결(단, 현재 사용 중인 세션은 제외)을 종료하려면 다음 쿼리를 실행합니다.

SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = current_database()
  AND state = 'idle'
  AND pid <> pg_backend_pid();
  • pg_terminate_backend(pid): 지정한 프로세스 ID(pid)를 가진 연결을 강제로 종료하는 함수입니다.
  • datname = current_database(): 현재 데이터베이스에 연결된 세션들만 대상으로 합니다.
  • state = 'idle': idle 상태인 연결만 선택합니다.
  • pid <> pg_backend_pid(): 현재 사용 중인 세션은 제외하여 자기 자신을 종료하지 않도록 합니다.

이 쿼리를 통해 필요 없는 idle 연결을 정리하면 max connection 오류를 예방할 수 있습니다.


4. 결론

이번 포스팅에서는 max connection 오류 발생 시 PostgreSQL 서버의 연결 상태를 진단하는 방법과, 불필요한 idle 연결을 종료하여 문제를 해결하는 방법에 대해 살펴보았습니다.

  • 서버 버전 및 현재 데이터베이스 상태 확인
  • 간단한 연결 테스트
  • pg_stat_activity를 통한 활성 연결 확인
  • idle 상태인 연결 종료
profile
Dreamer

0개의 댓글