서비스 운영 중 max connection 오류가 발생하여 원인을 파악하고 해결하는 과정을 진행했습니다.
Supabase 기반인 PostgreSQL에서 연결 상태를 점검하고, 불필요한 idle 연결을 종료하는 방법에 대해 정리.
PostgreSQL은 동시에 처리할 수 있는 최대 연결 수를 제한합니다. 이 제한을 초과하면 서비스에 연결할 수 없게 되어 max connection 오류가 발생합니다. 이 오류는 장시간 사용하지 않는 idle 연결들이 누적되거나, 애플리케이션에서 연결 관리를 적절히 하지 않을 때 나타날 수 있습니다.
문제의 원인을 파악하기 위해 우선 PostgreSQL 서버에 정상적으로 연결되어 있는지 확인해야 합니다. 아래와 같은 기본 SQL 쿼리들을 사용할 수 있습니다.
서버와의 연결이 정상적인지 확인하기 위해 다음 쿼리로 PostgreSQL 버전과 현재 데이터베이스 이름을 조회합니다.
SELECT version();
SELECT current_database();
이 두 쿼리를 통해 서버와의 연결이 문제없이 이루어지고 있는지, 현재 어떤 데이터베이스에 연결되어 있는지를 알 수 있습니다.
연결이 정상인지 단순히 테스트하기 위해 다음 쿼리를 실행할 수 있습니다.
SELECT 1;
쿼리가 에러 없이 실행된다면 연결 상태에는 문제가 없음을 의미합니다.
현재 데이터베이스에 어떤 세션들이 연결되어 있는지 확인하기 위해 아래 쿼리를 사용할 수 있습니다.
SELECT * FROM pg_stat_activity WHERE datname = current_database();
이 쿼리는 현재 데이터베이스의 모든 연결 상태를 보여주며, 각 세션의 상태(state) 정보를 확인할 수 있습니다.
max connection 오류의 주된 원인 중 하나는 장시간 idle 상태로 유지되는 연결들입니다. 이 경우 불필요한 idle 연결을 종료하여 연결 수를 줄일 수 있습니다.
현재 데이터베이스에서 idle 상태인 연결(단, 현재 사용 중인 세션은 제외)을 종료하려면 다음 쿼리를 실행합니다.
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = current_database()
AND state = 'idle'
AND pid <> pg_backend_pid();
이 쿼리를 통해 필요 없는 idle 연결을 정리하면 max connection 오류를 예방할 수 있습니다.
이번 포스팅에서는 max connection 오류 발생 시 PostgreSQL 서버의 연결 상태를 진단하는 방법과, 불필요한 idle 연결을 종료하여 문제를 해결하는 방법에 대해 살펴보았습니다.