[PostgreSQL] 접속 오류 해결 (connection pool 늘리기 / 테이블 lock 조회 / DB 작업 kill)
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 걸린 테이블 확인해보면
싹 사라진 걸 볼 수 있다.
문제 해결에 바빠 에러를 캡쳐를 못한게 아쉽다.
또 이렇게 배워간다.
[PostgreSQL] 테이블 lock 조회 및 kill하기 (tistory.com)