PostgreSQL · 2026-02-03

PostgreSQL 테이블 재정렬과 pg_repack 활용법

PostgreSQL 테이블 단편화 원인과 진단 방법을 설명하고 pg_repack 설치 postgres 절차와 pg_repack 사용법으로 안전한 테이블 재정렬 방법론

작성일 : 2026-02-03 ㆍ 작성자 : 관리자
post
목차

개요

데이터가 자주 갱신되면 테이블과 인덱스에 단편화(bloat)가 발생한다. 단편화는 디스크 사용량을 늘리고 쿼리 성능을 저하시키므로 주기적인 재정렬이 필요하다. 이 글에서는 단편화 진단법과 함께 pg_repack 사용법을 실제 예제로 설명한다.

테이블 단편화가 발생하는 이유

PostgreSQL은 MVCC 구조로 동작한다. UPDATE나 DELETE는 기존 행을 남기고 새 행을 작성한다. VACUUM이 수행되어야 공간을 회수하지만, 실제로 즉시 공간 재활용이 어려워 단편화가 쌓일 수 있다. 결과적으로 테이블 파일이 커지고 읽기 성능이 떨어진다.

단편화 징후

  • 디스크 사용량이 급증
  • 동일한 데이터에 대한 쿼리 성능 저하
  • VACUUM을 자주 실행해도 파일 크기가 줄지 않음

단편화 진단 방법

간단한 쿼리로 bloat를 추정할 수 있다. 정확한 도구로는 pgstattuple 확장이나 커뮤니티 제공 스크립트를 사용한다. 예시는 간단한 추정 쿼리다.

SELECT (pg_total_relation_size(relid) - pg_relation_size(relid)) AS bloat_bytes,
       relname
FROM pg_stat_user_tables
ORDER BY bloat_bytes DESC
LIMIT 10;

이 결과로 상위 bloat 대상 테이블을 확인한 뒤 재정렬을 고려한다.

pg_repack 소개

pg_repack은 온라인으로 테이블과 인덱스를 재구성하여 단편화를 제거하는 도구다. 재정렬 중에도 읽기/쓰기 작업을 대부분 허용하며, 최종 단계에서 짧은 잠금으로 원본을 교체한다. 따라서 가동 중인 서비스에 적합하다.

pg_repack 설치 (pg_repack 설치 postgres)

운영체제별 패키지 또는 소스 빌드 방식으로 설치할 수 있다. 일반적인 설치 방법은 다음과 같다.

# Debian/Ubuntu 패키지(패키지 이름은 배포판에 따라 다름)
sudo apt update
sudo apt install pg-repack

# 소스에서 빌드
sudo apt install build-essential libpq-dev postgresql-server-dev-all
git clone https://github.com/reorg/pg_repack.git
cd pg_repack
make
sudo make install

서버 측에 확장을 설치하려면 superuser 권한이 필요하다. 설치 후 각 데이터베이스에서 확장을 생성한다.

-- 데이터베이스 접속 후
CREATE EXTENSION pg_repack;

기본 사용법 (pg_repack 사용법)

가장 간단한 형태는 데이터베이스와 테이블을 지정하는 것이다. 사용자 인증 정보는 환경 변수나 옵션으로 전달한다.

# 테이블 단위 재정렬
pg_repack -d mydb -U myuser -h dbhost -p 5432 -t public.mytable

# 데이터베이스 전체 재정렬(주의 필요)
pg_repack -d mydb -U myuser -h dbhost -p 5432

옵션 설명:

  • -d, --dbname: 대상 데이터베이스
  • -t, --table: 재정렬할 테이블
  • -U, --username: 접속 사용자
  • -h, --host / -p, --port: 접속 호스트와 포트
  • --jobs: 병렬 작업 수로 처리 속도 향상 가능

실행 전 체크리스트

  • 전체 백업 또는 논리 백업 유무 확인
  • 충분한 디스크 여유 공간 확보(임시 파일 생성)
  • 스테이징 환경에서 동작 테스트
  • 확장 설치 및 권한(superuser) 확인

실전 예제: 인덱스 재빌드와 테이블 재정렬

특정 테이블의 인덱스와 테이블을 함께 재정렬하는 예제다.

# 환경 변수로 비밀번호 전달(간단한 예)
export PGPASSWORD='yourpassword'
pg_repack -d mydb -U myuser -h dbhost -p 5432 -t public.orders --jobs=4

# 실행 후 상태 확인은 pg_stat_user_tables로 파일 크기 비교

작업 중에는 짧은 잠금이 발생하므로 트랜잭션 민감 작업이 있는 시간대를 피해 실행하는 것이 좋다.

주의사항과 모범 사례

  • 디스크 여유 공간: pg_repack은 새 파일을 생성하므로 원본 크기만큼 여유 필요
  • 권한: 확장 설치와 일부 작업은 superuser 권한 필요
  • 테스트: 스테이징에서 복제 환경으로 검증한 뒤 운영 반영
  • 모니터링: 작업 중 로그와 서버 부하를 모니터링
  • VACUUM과 비교: VACUUM FULL은 긴 잠금을 요구하나 공간 회수는 확실. pg_repack은 온라인 대안

문제 해결 팁

실행이 실패하면 로그를 확인한다. 권한 문제, 확장 버전 불일치, 디스크 부족이 주요 원인이다. 확장 버전은 서버 PostgreSQL 버전과 일치해야 한다. 실패 시 먼저 스테이징에서 동일 버전으로 재현해 원인 파악을 권장한다.

요약

pg_repack은 온라인 환경에서 안전하게 테이블 재정렬을 수행할 수 있는 유용한 도구다. 단편화 진단 후 충분한 사전 준비(백업, 디스크 여유, 권한 확인)를 거쳐 적용하면 성능 회복에 도움이 된다. 운영 적용 전에는 항상 테스트를 통해 부작용을 최소화한다.

pg_repack 사용법 테이블 재정렬 postgres pg_repack 설치 postgres PostgreSQL 성능 데이터베이스 유지관리 테이블 단편화 VACUUM 대체 인덱스 재생성