PostgreSQL · 2026-03-18

PostgreSQL vacuumdb 사용법과 자동화

PostgreSQL vacuumdb의 동작 원리, 주요 옵션과 튜닝 포인트, cron 기반 자동화 스크립트 예제와 운영 시 고려사항을 정리한 기술자료

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

개요

PostgreSQL에서 VACUUM은 테이블의_dead tuples_을 정리하고 통계를 갱신해 성능을 유지하는 핵심 작업이다. 이 글에서는 vacuumdb 사용법과 vacuum 자동화 스크립트 postgres 환경에서 적용할 수 있는 실무 중심 내용, 그리고 vacuumdb 튜닝 postgres 관점의 권장 설정을 다룬다. 처음 접하는 사람도 이해하기 쉽도록 예제와 절차를 단계별로 설명한다.

VACUUM의 기본 개념

왜 VACUUM이 필요한가

PostgreSQL은 MVCC(다중 버전 동시성 제어)를 사용한다. 업데이트나 삭제 시 기존 행은 삭제 표시(marked)만 되고 실제로는 디스크에 남는다. 이 잔여 공간을 정리하지 않으면 테이블이 비대해지고 인덱스 효율이 떨어진다. VACUUM은 이런 불필요한 행을 제거하거나 재사용 가능한 공간으로 표시한다.

VACUUM의 종류

  • VACUUM: 기본 정리 작업. 공간 회수 및 통계는 부분적 반영.
  • VACUUM FULL: 테이블을 재작성해서 디스크 공간을 실제로 줄인다. 락이 발생한다.
  • ANALYZE: 통계 수집으로 쿼리 플래너가 더 나은 계획 수립.

vacuumdb 사용법

vacuumdb는 커맨드라인에서 여러 데이터베이스에 대해 VACUUM과 ANALYZE를 실행할 수 있는 유틸리티다. 간단한 사용법과 자주 쓰는 옵션을 먼저 살펴본다.

기본 명령

vacuumdb -d mydb

위 명령은 mydb 데이터베이스에 대해 기본 VACUUM을 수행한다. 권한 문제로 인해 보통 postgres 계정 또는 적절한 권한의 사용자로 실행한다.

자주 쓰는 옵션

  • -z, --analyze: VACUUM 후 ANALYZE 실행
  • -f, --full: VACUUM FULL 실행 (주의: 테이블 락 발생)
  • -t, --table=TABLE: 특정 테이블만 지정
  • -j, --jobs=N: 병렬 작업(여러 데이터베이스 또는 테이블을 동시에 처리할 때 유용)
  • -v, --verbose: 상세 출력

예제: 데이터베이스 전체를 분석까지 수행

vacuumdb -d mydb -z -v

vacuumdb 튜닝 postgres 관점

vacuumdb 자체는 단순 실행 도구지만, 레벨 높은 운영에서는 몇 가지 튜닝 포인트가 있다. 여기서는 autovacuum 설정, 임계값, 리소스 제어에 초점을 맞춘다.

autovacuum과 수동 VACUUM의 조화

PostgreSQL은 기본적으로 autovacuum 데몬이 자동으로 정리를 수행한다. 그러나 대량의 배치 작업이나 특정 테이블의 특성상 autovacuum만으로는 부족할 수 있다. 이런 경우에는 수동 vacuumdb 호출로 보완한다. 자동화는 autovacuum이 놓칠 수 있는 시점에 수동 VACUUM을 예약하는 방식으로 설계한다.

주요 파라미터

  • autovacuum_vacuum_threshold, autovacuum_vacuum_scale_factor: 트리거 임계값
  • autovacuum_max_workers: 동시 autovacuum 프로세스 수
  • maintenance_work_mem: VACUUM 작업 시 사용할 메모리 (큰 값은 속도 향상)
  • vacuum_cost_delay, vacuum_cost_limit: I/O 부담 조절

vacuum 자동화 스크립트 postgres 예제

운영 환경에서는 주기적으로 vacuum을 실행하도록 스크립트를 작성하고 cron으로 예약한다. 아래는 기본적인 예제 스크립트다. 스크립트는 장애 발생 시 로그를 남기고, 병렬 처리를 통해 시간이 오래 걸리는 문제를 완화한다.

단일 데이터베이스 정리 스크립트

#!/bin/bash
DB=mydb
LOGDIR=/var/log/postgres-vacuum
mkdir -p "$LOGDIR"
DATE=$(date +"%F_%H%M")
/usr/bin/vacuumdb -d "$DB" -z -v > "$LOGDIR/vacuum_$DATE.log" 2>&1

테이블별로 병렬 처리하는 예제

#!/bin/bash
DB=mydb
LOGDIR=/var/log/postgres-vacuum
mkdir -p "$LOGDIR"
TABLES=(table1 table2 table3)
for t in "${TABLES[@]}"; do
  (
    /usr/bin/vacuumdb -d "$DB" -t "$t" -z -v > "$LOGDIR/${t}_$(date +%F_%H%M).log" 2>&1
  ) &
done
wait

이 스크립트는 각 테이블을 백그라운드에서 병렬로 처리한 다음 wait로 완료를 대기한다.

cron으로 예약

일반적으로 트래픽이 적은 시간대에 스케줄링한다. 예: 매일 새벽 3시에 실행.

# crontab -e
0 3 * * * /opt/scripts/postgres_vacuum.sh

운영 시 고려사항

  • VACUUM FULL은 락이 발생하므로 서비스 시간과 충돌하지 않게 별도 계획 필요
  • 로그 및 모니터링: autovacuum 로그와 스크립트 로그를 수집해 실패 원인을 분석
  • 대용량 테이블은 파티셔닝이나 분할을 통해 VACUUM 부담을 줄임
  • vacuumdb 사용법 postgres, vacuum 자동화 스크립트 postgres, vacuumdb 튜닝 postgres 같은 키워드를 기반으로 문서화

모니터링 지표

중요 지표는 다음과 같다.

  • pg_stat_all_tables의 n_dead_tup: 삭제된 행 수
  • last_autovacuum, last_vacuum: 마지막 수행 시각
  • autovacuum 큐의 대기 시간 및 작업 실패 여부

요약

vacuumdb는 수동 VACUUM과 ANALYZE를 손쉽게 다룰 수 있는 도구다. autovacuum과 협업해 정기적으로 시스템을 정비하면 성능 저하를 예방할 수 있다. 또한 cron 기반의 자동화 스크립트 및 적절한 튜닝으로 운영 부담을 줄일 수 있다. 실무에서는 모니터링과 로그 수집을 병행해 문제를 조기에 발견하는 것이 가장 중요하다.

vacuumdb 사용법 postgres vacuum 자동화 스크립트 postgres vacuumdb 튜닝 postgres PostgreSQL vacuum autovacuum 설정 postgres 성능 튜닝 cron 자동화 vacuum 모니터링