WEBBOOK CHAPTER

PostgreSQL 18, 입문에서 시니어까지: 29장. 운영 쿼리 Triage 실습

29장. 운영 쿼리 Triage 실습

장애 제보가 오면 먼저 시간 범위, 영향 기능, 변경 이력, 오류율과 latency를 고정한다. 단일 slow query인지, lock이 줄을 만든 것인지, CPU·I/O·connection 한계인지를 구분한다. 진단 자체가 부하를 추가하므로 실행 횟수와 범위를 제한한다.


select pid, usename, application_name, state,
       clock_timestamp()-query_start as query_age,
       clock_timestamp()-xact_start as xact_age,
       wait_event_type, wait_event, left(query,160) as query
from pg_stat_activity
where datname=current_database() and pid<>pg_backend_pid()
order by coalesce(xact_start,query_start);

state='idle in transaction'의 오래된 xact는 vacuum과 lock을 막을 수 있다. 단순 idle connection과 구분한다. blocking chain은 pg_blocking_pids(pid)로 찾고, blocker를 종료하기 전 owner·business operation·rollback 영향을 확인한다.


select blocked.pid,
       pg_blocking_pids(blocked.pid) as blockers,
       blocked.wait_event,
       clock_timestamp()-blocked.query_start as waited,
       left(blocked.query,120) as blocked_query
from pg_stat_activity blocked
where cardinality(pg_blocking_pids(blocked.pid))>0;

완화는 취소, traffic 제한, feature flag, query 변경, index, pool 조정 중 가장 작은 영향을 고른다. pg_cancel_backend는 현 query, pg_terminate_backend는 session을 종료한다. 둘 다 transaction rollback과 application retry를 발생시킬 수 있다.