본문 바로가기
Database

[PostgreSQL] 접속 오류 해결 (connection pool 늘리기 / 테이블 lock 조회 / DB 작업 kill)

by 비전공자 기록광 2022. 12. 9.
반응형

DB가 갑작스럽게 비정상적으로 종료가 된 이후부터 접속이 안됐다.

에러메시지는 이렇게 떴다.

FATAL: remaining connection slots are reserved for non-replication superuser connections


찾아보니 접속 가능한 클라이언트 수를 초과해 발생하는 에러고
postgresql.conf 파일에서 max_connections의 값을 늘려주면 해결된다고 했다.

내 경우 conf 파일 경로는
/etc/postgresql/14/main 에 있었다.

🚩 vi postgresql.conf
max_connections 를 찾아 값을 기본 100 에서 1000으로 늘려줬다.


하지만 이 파일은 readonly 파일이고 권한이 없어서 저장이 안된다.

E212: Can't open file for writing


🚩 :w !sudo tee % > /dev/null
이 명령으로 저장할 수 있다.


그리고 sql shell로 해당 DB에 접속해보니 접속이 가능했다.

이제 해야할 건 Lock 걸린 테이블을 조회하고 연관된 작업들을 kill해준다.

🚩 현재 DB에서 수행중인 SQL 전체 조회
select datname, pid, usename, application_name, client_addr, client_port, backend_start, query_start, wait_event_type, state, backend_xmin, query
from pg_stat_activity;

해당 쿼리를 날리니 idle in trancation(aborted)가 있었다.

🚩 lock 걸린 테이블 확인
SELECT t.relname, l.locktype, page,virtualtransaction, pid, mode,granted
FROM pg_locks l, pg_stat_all_tables t
WHERE l.relation = t.relid
ORDER BY relation ASC;

특정 테이블에서 lock이 많이 조회됐다.

작업을 kill 해줄 때 연계된 모든 프로세스를 종류시켜줬다.

🚩 SELECT pg_terminate_backend( PID ) FROM pg_stat_activity;

다시 lock 걸린 테이블 확인해보면
싹 사라진 걸 볼 수 있다.


문제 해결에 바빠 에러를 캡쳐를 못한게 아쉽다.
또 이렇게 배워간다.



참고
[SQL 에러] FATAL: remaining connection slots are reserved for non-replication superuser connections (tistory.com)

[SQL 에러] FATAL: remaining connection slots are reserved for non-replication superuser connections

목차 에러 메시지 원인 원인해결 에러 메시지 FATAL: remaining connection slots are reserved for non-replication superuser connections 원인 클라이언트가 접속할 수 있는 pool의 최대 값이 초과하였거나 혹은 데이터

sina-lab.tistory.com

[PostgreSQL] 테이블 lock 조회 및 kill하기 (tistory.com)

[PostgreSQL] 테이블 lock 조회 및 kill하기

현재 수행중인 SQL 전체 조회 select datname, pid, usename, application_name, client_addr, client_port, backend_start, query_start, wait_event_type, state, backend_xmin query from pg_stat_activity; 위 쿼리 실행시 현재 DB에서 돌고 있는

kwomy.tistory.com

반응형

댓글