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)
'Database' 카테고리의 다른 글
[InfluxDB] Flux (사용법/문법/InfluxQL/timezone 설정) (2) | 2023.11.24 |
---|---|
[MySQL] root 비밀번호 잊어버렸을 때 해결 (mysql root reset / password reset) (0) | 2023.06.15 |
[DAsP 4과목] 데이터 모델링 (정리본 / 요약본) (2) | 2022.11.19 |
[DAsP 3과목] 데이터 표준화 (정리본 / 요약본) (0) | 2022.11.19 |
[DAsP 2과목] 정보 요구 사항 조사 (정리본 / 요약본) (0) | 2022.11.18 |
댓글