설문조사
PostgreSQL/PPAS 관련 듣고 싶은 교육은


총 게시물 187건, 최근 0 건
   

사용자 Query 수행 이력

글쓴이 : 손놀림 날짜 : 2018-11-01 (목) 17:46 조회 : 15219
안녕하세요. Postgresql을 잘 사용하고 있는 유저 입니다.

빅데이터쪽 연계만 하다가 이번에 Postgresql Query를 사용하려 하니 익숙하지가 않네요.


현재 사용자가 Query를 날리면 사용했던 쿼리의 데이터 사이즈를 알고 싶은 상황 입니다.

예를 들어 test_table의 사이즈가 1억건에 10GB이고

SELECT a, b, c, d FROM defaut.test_table WHERE a = '남자' ORDER BY b DESC Query를 수행했을 때

Query 결과가 7300만건이라고 하면, 위 query 결과의 사이즈를 측정한 postgresql query를 만들 수 있을까요?

저는최종적으로 아래와 같은 결과를 도출하고 싶은 상황 입니다.


디비명    테이블명    사용자명    IP                  쿼리 시작 시간      쿼리 종료 시간            쿼리                                                                                                          수행 쿼리 사이즈      상태
default    test_table      gtuf      192.168.1.1      2018-11-01 17:33    2018-11-01 17:33      SELECT a, b, c, d FROM defaut.test_table WHERE a = '남자' ORDER BY b DESC      7000MB          FINISHED
default    test_table      user2    192.168.20.1    2018-11-01 17:33    2018-11-01 17:33      SELECT a, b, c, d FROM defaut.test_table WHERE a = '여자' ORDER BY b DESC      3000MB          RUNNING

현재 보고 있는 postgresql 테이블은 pg_stat_statements, pg_stat_activity 테이블 이며,

pg_stat_activity 테이블에서는 디비명, 테이블명, 사용자명, IP, query, 수행 시간 등 대부분의 정보를 포함하고 있고,

pg_stat_statements 테이블에서는 query, share_blks_hit, read 등 query 수행 시 작업한 량을 가지고 있는 것 같은데 현재 조합 및 계산을 생각하지 못하고 있는 상황이며,

두 테이블을 조인해서 가져오려고 했으나, pg_stat_statements 테이블에서는 사용자가 보낸 쿼리를 수행하기 위한 Step 별 query까지 가지고 있어 dbid와 userid로 조인 했을때 보기가 어려운 상황 입니다.


제가 지금까지 본 상황을 나열한 거라 이해하기 어려우실 수도 있으니 양해 부탁 드리며,

위와 같은 결과를 도출해내기 위한 조언을 해주시면 감사하겠습니다.

PostgresDBA 2018-11-02 (금) 14:53
사용자가 수행한 sql 기록을 남기는 audit 이 목적인가요?
문제가 됐을때 특정 sql 을 날린 사용자를 추적하기 위함인가요?

모든 sql 을 추적하고 싶으시면 log_min_duration_statement 을  활용하세요
로그화일에 수행완료 시간이 남습니다. 아마 로그파서기를 따로 만들던지 해야겠지요.
(회사에서  위와 비슷한 용도로 로그화일내의 sql 정보를 수집하여 테이블에 저장해주는 로그파서기가 있기는 합니다만,  공개할수는 없고..)

실행*중*인 sql 은 pg_stat_activity 를 보셔야 합니다.
 pg_stat_statements 나 log_min_duration_statement 에는 실행*완료*된 sql 만 남습니다.

수행쿼리사이즈는 추출하기 힘들지만,
 rows 수는 알수 있습니다. 추가적인 세팅으로 sql 의 버퍼 IO 도 구할수 있습니다.
댓글주소
손놀림 2018-11-07 (수) 09:23
상세하게 답변해주셔서 감사합니다~
우선 제가 질문한 목적은 사용자가 특정 기간 동안 어떤 쿼리를 날렸고 수행 이력이 어떻게 되는지 알고 싶어서 질문드렸습니다.
쿼리, 시작 시간, 종료 시간, 상태(IDLE, RUNNING, FINISHED), row 수, 수행쿼리사이즈(쿼리를 실행한 결과의 데이터 용량) 등 입니다.

알려주신 대로 pg_stat_activity, pg_stat_statements, log_min_duration_statement를 잘 짬뽕해봐야겠지만 뜯어서 보려면 시간이 좀 걸리겠네요..ㅋㅋ

알려주셔서 감사 드립니다~
댓글주소
손놀림 2018-11-07 (수) 09:26
log_min_duration_statement를 0으로 설정하면 모든 수행 쿼리에 대한 로그가 남는데
사용자들이 수행한 쿼리 외 시스템 쿼리로 다 남는 건가요?
0으로 설정했을 때 로그 사이즈가 기하 급수적으로 커질 수 있는 건지 감이 잘 안오네요..

운영자님은 어떻게 설정하셨는지 알려주시면 감사하겠습니다~
댓글주소
     
     
PostgresDBA 2018-11-08 (목) 12:15
log_min_duration_statement 는 시스템전체레벨, 또는 특정 유저나 특정 디비레벨로도 걸수있습니다.
댓글주소
주킹 2018-11-07 (수) 16:36
EDB라면 내장된audit 설정을 활용하시고요
커뮤니티 버전이라면 pg_audit구성을 하셔야 할듯합니다. 기존 제공하는 기능에서 하려면 log를 많이 쌓아야합니다.
댓글주소
     
     
PostgresDBA 2018-11-08 (목) 12:16
이것도 좋은 생각이네요
안써봤는데 조만간에 어떤게 로깅되는지 글올려보겠습니다.
댓글주소
손놀림 2018-11-23 (금) 11:22
헉 바빠서 댓글을 확인 못했었는데,  좋은 의견들을 많이 주셨네요

관심 가져 주셔서 감사 드립니다.

아직 프로젝트가 로그 단계 작업까지는 오지 못해서 신경 쓰지 못하고 있지만,

말씀 해주신 사항들 참고해 보겠습니다.

감사합니다.~
댓글주소
   

postgresdba.com