PostgreSQL vacuumdb 사용법과 자동화
PostgreSQL vacuumdb의 동작 원리, 주요 옵션과 튜닝 포인트, cron 기반 자동화 스크립트 예제와 운영 시 고려사항을 정리한 기술자료
목차
개요
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 기반의 자동화 스크립트 및 적절한 튜닝으로 운영 부담을 줄일 수 있다. 실무에서는 모니터링과 로그 수집을 병행해 문제를 조기에 발견하는 것이 가장 중요하다.