다음을 통해 공유


Azure Database for PostgreSQL - 유연한 서버에서 pg_repack 사용하여 전체 진공

적용 대상: Azure Database for PostgreSQL - 유연한 서버

이 문서에서는 bloat을 제거하고 Azure Database for PostgreSQL 유연한 서버 성능을 개선하는 데 사용하는 pg_repack 방법을 알아봅니다. Bloat은 빈번한 업데이트 및 삭제로 인해 테이블 및 인덱스에 누적되는 불필요한 데이터입니다. Bloat으로 인해 데이터베이스 크기가 예상보다 커질 수 있으며 일부 쿼리의 성능에 심각한 영향을 줄 수 있습니다. 낭비된 공간을 회수하고 데이터를 보다 효율적으로 재구성하는 데 사용합니다 pg_repack .

pg_repack이란?

pg_repack 는 테이블 및 인덱스에서 bloat을 제거하고 보다 효율적으로 재구성하는 PostgreSQL 확장입니다. pg_repack 는 대상 테이블 또는 인덱스의 새 복사본을 만들고, 프로세스 중에 발생한 변경 내용을 적용한 다음, 이전 버전과 새 버전을 원자성으로 교환하여 작동합니다. pg_repack 는 작업 시작 및 종료 시의 짧은 기간을 제외하고 처리된 테이블 또는 인덱스에서 가동 중지 시간 또는 단독 액세스 잠금이 필요하지 않습니다. Azure Database for PostgreSQL 유연한 서버 데이터베이스의 테이블 또는 인덱스를 최적화하는 데 사용할 pg_repack 수 있습니다.

pg_repack 사용 방법

사용 pg_repack하려면 Azure Database for PostgreSQL 유연한 서버 데이터베이스에 확장을 설치한 다음 명령을 실행 pg_repack 하여 최적화하려는 테이블 이름 또는 인덱스를 지정해야 합니다. 확장은 최적화가 진행되는 동안 다른 작업이 수행되지 않도록 테이블 또는 인덱스에 대한 잠금을 확보합니다. bloat을 제거하고 데이터를 보다 효율적으로 재구성합니다.

전체 테이블 재포장 작동 방식

전체 테이블 재포장 작업을 수행하기 위해 확장은 다음 단계를 수행합니다.

  1. 원래 테이블의 변경 내용을 기록하는 로그 테이블을 만듭니다.
  2. 원래 테이블에 트리거를 추가하여 INSERT, UPDATE 및 DELET을 로그 테이블에 로깅합니다.
  3. 원래 테이블의 모든 행을 포함하는 새 테이블을 만듭니다.
  4. 새 테이블에 인덱스를 빌드합니다.
  5. 로그 테이블에 기록된 모든 변경 내용을 새 테이블에 적용합니다.
  6. 인덱스 및 알림 테이블을 포함하여 원래 테이블과 새 테이블을 바꿉니다.
  7. 원래 테이블을 삭제합니다.

이러한 단계에서는 pg_repack 초기 설정(1단계 및 2단계) 및 최종 스왑 및 삭제 단계(6단계 및 7단계) 중에 짧은 기간 동안만 단독 액세스 잠금을 유지합니다. 나머지 시간 pg_repack 동안은 원래 테이블에 공유 액세스 잠금만 유지하면 INSERT, UPDATE 및 삭제가 평소와 같이 진행되도록 할 수 있습니다.

제한 사항

pg_repack 에는 사용하기 전에 알아야 할 몇 가지 제한 사항이 있습니다.

  • 작업이 성공하려면 대상 테이블에 NOT NULL 열에 PRIMARY KEY 또는 UNIQUE 인덱스가 있어야 합니다.
  • 실행 중인 동안 pg_repack 에는 VACUUM 또는 ANALYZE를 제외한 대상 테이블에서 DDL(데이터 정의 언어) 명령을 수행할 수 없습니다. 이러한 제한이 적용 pg_repack 되도록 하려면 전체 테이블을 다시 패킹하는 동안 대상 테이블에 공유 액세스 잠금을 유지합니다.

설정

필수 조건

  1. pg_repack 확장을 허용 목록에 추가하고 만들어 확장을 구성합니다.

pg_repack 클라이언트 애플리케이션 빌드

이 확장을 사용하려면 Ubuntu 인스턴스에 빌드하고 설치할 수 있는 클라이언트 애플리케이션이 필요합니다.

버전 1.4.7을 pg_repack설치하려면 Ubuntu 컴퓨터에서 다음 bash 스크립트를 실행합니다.

# Create the file repository configuration
sudo sh -c 'echo "deb https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
# Import the repository signing key
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
# Update the package lists
sudo apt-get update
# Install required packages to build the code
sudo apt-get install -y postgresql-server-dev-14 unzip make gcc libssl-dev liblz4-dev zlib1g-dev libreadline-dev libzstd-dev
# Download compressed version of build tree for version 1.4.7 of pg_repack
wget 'https://api.pgxn.org/dist/pg_repack/1.4.7/pg_repack-1.4.7.zip'
# Uncompress build tree
unzip pg_repack-1.4.7.zip
# Set current directory to where build tree was uncompressed
cd pg_repack-1.4.7
# Build code
sudo make
# Copy resulting binaries to /usr/local/bin
sudo cp bin/pg_repack /usr/local/bin
# Run pg_repack to check its version
pg_repack --version

pg_repack 사용

다음 명령을 사용하여 엔드포인트 pgserver.postgres.database.azure.com, 사용자 이름 azureuser 및 데이터베이스 foo를 사용하여 Azure Database for PostgreSQL 유연한 서버 인스턴스 내의 공용 스키마에 있는 정보라는 테이블에서 실행하는 pg_repack 방법의 예입니다.

  1. 기본 설정의 클라이언트를 사용하여 Azure Database for PostgreSQL 유연한 서버 인스턴스에 연결합니다. 이 예제에서는 psql을 사용합니다.

        psql "host=<server>.postgres.database.azure.com port=5432 dbname=<database> user=<user> password=<password> sslmode=require"
    
  2. 데이터베이스에 설치된 확장 버전을 pg_repack 찾습니다.

    SELECT installed_version FROM pg_available_extensions WHERE name = 'pg_repack';
    
  3. 확장 버전은 다음 명령을 실행하여 확인할 수 있는 클라이언트 애플리케이션의 버전과 일치해야 합니다.

    azureuser@azureuser:~$ pg_repack --version
    
  4. 데이터베이스 foo에 있는 정보라는 테이블에 대해 클라이언트를 실행 pg_repack 합니다.

    pg_repack --host=<server>.postgres.database.azure.com --username=<user> --dbname=<database> --table=info --jobs=2 --no-kill-backend --no-superuser-check
    

pg_repack 옵션

프로덕션 워크로드에 대한 유용한 pg_repack 옵션:

  • -k, --no-superuser-check: 클라이언트에서 슈퍼 사용자 검사를 건너뜁니다. 이 설정은 Azure Database for PostgreSQL 유연한 서버 인스턴스와 같이 슈퍼 사용자 이외의 사용자로 실행을 지원하는 플랫폼에서 사용하는 pg_repack 데 유용합니다.

  • -j, --jobs: Azure Database for PostgreSQL 유연한 서버에 대해 지정된 수의 추가 연결을 만들고 이러한 추가 연결을 사용하여 각 테이블에서 인덱스 다시 작성을 병렬화합니다. 병렬 인덱스 빌드는 전체 테이블 리팩에 대해서만 지원됩니다.

  • --index 또는 --only 인덱스 옵션: Azure Database for PostgreSQL 유연한 서버 인스턴스에 추가 코어와 디스크 I/O를 사용할 수 있는 경우 이 옵션을 사용하면 속도를 높일 pg_repack수 있습니다.

  • -D, --no-kill-backend: 차단 쿼리를 실행하는 백 엔드 클라이언트를 죽이는 대신 지정된 --wait-timeout시간을 기다린 후 잠금을 가져올 수 없는 경우 테이블의 재패킹을 건너뜁니다. 기본적으로 --wait-timeout 60초로 설정됩니다. 이 매개 변수의 기본값은 false입니다.

  • -E LEVEL, --elevel=LEVEL: , ,, WARNINGFATALINFONOTICEERRORLOGPANIC.에서 DEBUG출력 메시지 수준을 선택합니다. 기본값은 INFO입니다.

모든 옵션을 이해하려면 pg_repack 설명서를 참조하세요.

질문과 대답

pg_repack 확장 또는 클라이언트 쪽 실행 파일(예: psql 또는 pg_dump)입니까?

pg_repack 실제로 둘 다입니다. pg_repack/lib 에는 만든 스키마 및 SQL 아티팩트 및 여러 함수의 코드를 구현하는 C 라이브러리를 포함하여 확장에 대한 코드가 있습니다.

반면에 pg_repack/bin 에는 확장에 구현된 프로그래밍 기능 요소와 상호 작용하는 방법을 알고 있는 클라이언트 애플리케이션에 대한 코드가 있습니다. 이 클라이언트 애플리케이션은 서버 쪽 확장에 의해 표면화된 다양한 인터페이스와 상호 작용하는 복잡성을 완화하는 것을 목표로 합니다. 사용자에게 이해하기 쉬운 몇 가지 명령줄 옵션을 제공합니다. 가리키는 데이터베이스에서 만든 확장이 없으면 클라이언트 애플리케이션은 쓸모가 없습니다. 서버 쪽 확장은 자체적으로 완벽하게 작동하지만 사용자가 복잡한 상호 작용 패턴을 이해해야 합니다. 이 패턴은 쿼리를 실행하여 확장에 의해 구현된 함수에 대한 입력으로 사용되는 데이터를 검색하는 등으로 구성됩니다.