YugabyteDB의 pg_stat_statements

PostgreSQL을 사용하는 분산 SQL 데이터베이스인 YugabyteDB에서는 pg_stat_statements 확장이 기본적으로 설치됩니다. 그러나 명령문은 각 노드에서 로컬로 수집되므로 각 노드에서 쿼리pg_stat_statements 또는 호출pg_stat_statements_reset()이 필요합니다. YugabyteDB는 클라우드 네이티브이므로 노드를 추가하고 제거할 수 있습니다. YugabyteDB Managed 또는 YugabyteDB Anywhere을 사용하면 자동으로 수행됩니다. YugabyteDB를 무료로 사용하고 있다면 자동화해야 합니다.

여기에서 쉽게 할 수 있는 방법을 보여주고 있습니다.

먼저, host 출처 및 ts 수집 시점의 타임스탬프를 사용하여 모든 노드에서 수집된 명령문을 보관할 테이블을 생성해 보겠습니다.

drop table if exists ybwr_statements ;
create table ybwr_statements  as
select now() as ts,'' as host, * 
from pg_stat_statements where null is not null;


Create Table As Select를 사용하면 버전을 통해 발전할 수 있는 테이블 구조에 독립적입니다.

이제 예를 들어 모든 노드에서 수집할 plpgsql 코드입니다.
  • yb_servers()에서 서버 목록을 쿼리합니다.
  • COPY TO PROGRAM을 사용하여 각 노드
  • 에 있는 ysqlsh에 해당하는 psql를 실행합니다.
  • postmaster.opts 파일에서 찾았습니다. find 또는 yb-tserver 작업 디렉토리
  • 에서 가져올 수도 있습니다.
  • 어쨌든 입력 쿼리 입력이 필요하므로 COPY TO를 통해 insert into ybwr_statements select '%s','%s',* from pg_stat_statements에 STDIN으로 전달하는 ysqlsh를 실행합니다
  • .
  • 또한 pg_stat_statements_reset()로 재설정했는데 수집이 성공했습니다(ysqlsh-v ON_ERROR_STOP=1 호출)
  • 디버깅을 위해 명령줄 끝에 > /tmp/log.txt 2>&1를 추가합니다. COPY FROM PROGRAM을 사용하여 쿼리를 -c로 전달하고 출력을 테이블에 저장하는 것을 선호할 수 있습니다.

  • 여기있어:

    do $DO$
    declare i record;
    begin
    for i in (select now() as ts, host from yb_servers()) loop
     execute format(
      $COPY$
      copy (select $SQL$ insert into ybwr_statements select '%s','%s',* from pg_stat_statements; select pg_stat_statements_reset(); $SQL$ ) to program
       $BASH$ $(awk '{sub("/postgres/bin/postgres .*","");print}' ./postmaster.opts)/bin/ysqlsh -h $(hostname) -v ON_ERROR_STOP=1 $BASH$
      $COPY$
     ,i.ts,i.host);
    end loop;
    end;
    $DO$
    ;
    


    그런 다음 ybwr_statements를 쿼리할 수 있습니다.

    select ts, host, calls, total_time, query 
    from ybwr_statements 
    order by total_time;
    


    다음은 캡처 쿼리만 캡처한 유휴 데이터베이스의 예입니다.


    이것은 기술을 보여주는 예입니다. 매시간처럼 예약할 수 있으며 ybwr_statements 테이블에 쿼리의 매시간 스냅샷이 있습니다. 호출하지 않도록 선택할 수 있으며pg_stat_statements_reset() 쿼리 시 스냅샷을 비교합니다.

    좋은 웹페이지 즐겨찾기