Postgresql/admin

기본 모니터링 쿼리

dbavayne 2025. 2. 13. 14:11

 

카탈로그 정보

pg_catalog : tables, views, functions, indexes, fdw, trigger, constraints, rules, users, groups 등등 정보 저장
pg_attribute : 테이블 및 다른 pg_class object columns에 대한 정보 저장
pg_index : 인덱스에 대한 정보 저장
pg_depend : object dependent에 대한 정보
pg_rewrite : 테이블 및 view 에 대한 rules 정보 
pg_constraint : 테이블에 constraint 정보 
pg_stat_statements : db에서 수행된 쿼리에 대한 통계 정보
pg_buffercache : cache에 대한 deeper 한 정보
information_schema : 메타 정보를 담고 있는 view

 

권장 메모리 설정

  1) shared buffers (shared_buffers, default 32MB) : 전체 메모리에 25% 설정
  2) working memory (work_mem, default 1MB) : work_mem * 전체 커넥션수
  3) checkpoint_segments : 값을 높이면 쓰기 성능이 좋아지고, 낮추면 복구 시간이 빨라짐.
  4) effective_cache_size : disk caching, 전체에 50 ~ 70%
  5) random_page_cost (default 4.0) : ssd, san 3, 1.5 ~ 2.5 

 

세션관련

접속된 사용자 확인

SELECT datname, usename, client_addr, client_port, application_name FROM pg_stat_activity;
5초 간격으로 위에 SQL를 수행 => \watch 5

 

Active 세션 확인
SELECT datname, usename, state, query FROM pg_stat_activity WHERE state = 'active';
* 세션에 대한 detail한 분석은 pg_stat_statement 설치 (real-time performance for query)

 

wait 또는 blocking 되는 세션 확인
SELECT datname, usename, query FROM pg_stat_activity WHERE waiting = true;

 

kill session
  postgresql에 세션 kill 아래 3가지 순서로 차례로 진행하면 됨 (1이 안되면 2, 2 안되면 3)
  1) pg_cancel_backend(pid)          -- current query kill and not disconnect
  2) pg_terminate_backend(pid)        -- connection disconnect. 
  3) kill -9 process
 
  10분동안 유휴 상태인 세션 kill
  SELECT pg_terminate_backend(pid) FROM pg_stat_activity
  WHERE state = 'idle in transaction' AND current_timestamp - query_start > '10 min';
 
  현재 세션을 제외한 모든 세션 kill.
  SELECT pg_terminate_backend(pid) FROM pg_stat_activity 

  WHERE datname = current_database() AND pid <> pg_backend_pid();
 

Query 관련

long 실행 쿼리 확인
SELECT
    current_timestamp - query_start AS runtime,
    datname, usename, query
FROM pg_stat_activity 
WHERE state = 'active' ORDER BY 1 DESC;

 

1분 이상 실행되는 쿼리 확인
SELECT
    current_timestamp - query_start AS runtime,
    datname, usename, query
FROM pg_stat_activity
WHERE state = 'active'
      AND current_timestamp - query_start > '1 min'
ORDER BY 1 DESC;

 

query를 process title에 보이도록 설정 (postgresql.conf)
  update_process_title = on

Temp 관련

별도 temporary 테이블스페이스 사용 확인
 SELECT current_setting('temp_tablespaces');  -- 결과가 없으면 default tablespace 사용
 

위 쿼리의 결과가 나오면 다음 SQL를 사용하여 사용량 확인
WITH temporary_tablespaces AS (
  SELECT unnest(string_to_array(
    current_setting('temp_tablespaces'), ',')
  ) AS temp_tablespace
)   
SELECT tt.temp_tablespace,
  pg_tablespace_location(t.oid) AS location,
  -- t.spclocation AS location, -- for 9.0 and 9.1 users
  pg_tablespace_size(t.oid) AS size
FROM temporary_tablespaces tt
JOIN pg_tablespace t ON t.spcname = tt.temp_tablespace
  ORDER BY 1;

 

위 쿼리의 결과가 안나오면 다음과 같은 방법으로 사용량 확인
  SELECT current_setting('data_directory') || '$PG_HOME/base/pgsql_tmp'
  SELECT datname, temp_files, temp_bytes, stats_reset
  FROM pg_stat_database;

 

데이터 사용량 관련

데이터베이스 사용량 확인
SELECT pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) AS size FROM pg_database;
 
select oid from pg_database;
du -h /data_dir/base/oid
 
테이블 사용량 확인
SELECT tablename, pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) FROM pg_tables WHERE schemaname = 'car_portal_app' LIMIT 2;
    
인덱스 사용량 확인
SELECT indexrelid::regclass,  pg_size_pretty(pg_relation_size(indexrelid::regclass))  FROM pg_index WHERE indexrelid::regclass::text like 'car_portal_app.%' limit 2;
 

오브젝트 사용여부 관련

사용하지 않은 테이블 2개 출력
SELECT relname FROM pg_stat_user_tables WHERE n_live_tup= 0 limit 2;
  
SELECT schemaname, tablename, attname FROM pg_stats WHERE null_frac= 1 and schemaname NOT IN ('pg_catalog', 'information_schema') limit 1;
 
인덱스가 사용되는지 확인
SELECT schemaname, relname, indexrelname FROM pg_stat_user_indexes s JOIN pg_index i ON s.indexrelid = i.indexrelid WHERE idx_scan=0 AND NOT indisunique AND NOT indisprimary;
 
foreign key 확인
SELECT * FROM pg_constraint WHERE contype = 'f';

 

 

 

 

출처

https://semode.tistory.com/6

'Postgresql > admin' 카테고리의 다른 글

VACUUM type 에 따른 redo 발생량 차이  (0) 2024.11.13