PostgreSQL · 2026-05-12

PostgreSQL 병렬 복원과 성능 최화 전략

pg_restore 병렬 옵션 사용법과 restore 성능 튜닝 postgres 관점에서 PostgreSQL 복원 속도 개선 방법을 단계별로 정리한 설명

작성일 : 2026-05-12 ㆍ 작성자 : 관리자
post
목차

개요

대용량 PostgreSQL 데이터베이스를 복원할 때 단일 스레드 복원은 시간이 많이 소요된다. 이 글은 병렬 복원 postgres pg_restore를 활용해 복원 시간을 줄이는 방법과 restore 성능 튜닝 postgres 관점의 실무적 고려사항을 설명한다. 처음 접하는 사람도 이해할 수 있도록 기본 개념부터 명령 예시, 성능 점검 항목까지 순서대로 다룬다.

병렬 복원의 기본 개념

왜 병렬 복원이 필요한가

단일 프로세스로 처리하면 테이블, 인덱스, 데이터 로드가 순차적으로 진행된다. 반대로 병렬 복원은 여러 작업을 동시 수행해 IO와 CPU를 더 효율적으로 사용한다. 특히 다수의 독립적 테이블이 존재하는 스키마에서 효과가 크다.

제약 사항

  • 병렬 복원은 덤프가 custom(-Fc) 또는 directory(-Fd) 형식일 때만 지원된다.
  • 의존성이 있는 객체(예: 외래키가 얽힌 테이블)는 병렬 효과가 제한된다.
  • 병렬 수를 무작정 높이면 오히려 성능 저하 또는 리소스 경쟁이 발생한다.

pg_restore 병렬 옵션 사용법

가장 기본적인 옵션은 -j 또는 --jobs 이다. 사용법은 간단하다. 먼저 덤프를 custom 또는 directory 형식으로 생성한다.

덤프 생성 예시

pg_dump -Fc -f /backup/mydb.dump mydb

병렬 복원 예시

pg_restore -d targetdb -j 8 /backup/mydb.dump

위 명령은 최대 8개의 작업을 병렬로 실행한다. 상황에 따라 -j 값을 조정한다. 대개 CPU 코어 수와 IO 성능을 고려해 결정한다.

디렉토리 형식 예시

pg_dump -Fd -j 4 -f /backup/mydb_dir mydb
pg_restore -d targetdb -j 8 /backup/mydb_dir

디렉토리 형식은 여러 파일로 분할 저장한다. 대규모 환경에서 네트워크나 디스크 병목을 줄이는 데 유리하다.

성능 튜닝 포인트

단순히 -j 값을 높이는 것만으로 최적화가 완성되지는 않는다. 서버와 복원 전략을 함께 튜닝해야 한다.

서버 설정 권장 사항

  • maintenance_work_mem: 인덱스 생성과 같은 작업에 큰 영향을 준다. 복원 시 일시적으로 늘리면 속도가 개선된다.
  • synchronous_commit: 복원 중 일시적으로 off로 설정하면 WAL 동기 작업 비용을 줄인다. 복원 완료 후 다시 설정한다.
  • checkpoint 관련 파라미터: checkpoint 빈도를 낮추면 복원 중 디스크 I/O를 줄일 수 있다.

데이터베이스 수준 전략

  • 인덱스는 가능한 한 데이터 로드 후에 생성한다. 데이터 로드와 인덱스 생성의 동시 실행은 비효율적일 수 있다.
  • 외래키와 제약 조건은 데이터 로드 후 적용하거나, 복원 도중 disable 형태를 고려한다.
  • 통계(ANALYZE)는 최종 단계로 이동한다. 불필요한 최적화 비용을 줄일 수 있다.

실전 구성과 체크리스트

실무에서는 다음 절차를 권장한다. 단계별로 진행하면서 성능을 측정한다.

  • 1) 덤프를 -Fc 또는 -Fd로 생성
  • 2) 대상 서버의 일시적 설정 조정(maintenance_work_mem, synchronous_commit 등)
  • 3) pg_restore -j N으로 병렬 복원
  • 4) 인덱스 및 제약 조건 적용(필요 시 병렬로 실행 가능 여부 검토)
  • 5) ANALYZE 및 통계 수집
  • 6) 서버 설정 원복과 검증

실제 명령 예시 모음

# 서버 설정 일시 변경 (psql에서 실행)
ALTER SYSTEM SET maintenance_work_mem = '1GB';
ALTER SYSTEM SET synchronous_commit = off;
SELECT pg_reload_conf();

# 복원 실행
pg_restore -d targetdb -j 12 /backup/mydb.dump

# 복원 후 작업
ANALYZE VERBOSE;
ALTER SYSTEM RESET maintenance_work_mem;
ALTER SYSTEM RESET synchronous_commit;
SELECT pg_reload_conf();

성능 문제 진단 팁

병렬로 실행했는데도 속도가 느리면 원인을 확인한다. 대표적인 원인은 다음과 같다.

  • 디스크 I/O 포화: 복원은 주로 쓰기 작업이며, 디스크가 병목이면 -j 값을 낮춘다.
  • CPU 한계: 복원 작업이 인덱스 생성 등 CPU 집약적이면 코어 수를 고려한다.
  • 연결 수 제한: 데이터베이스의 max_connections나 리소스 제한으로 작업이 병목될 수 있다.
  • 객체 의존성: 외래키나 트리거 때문에 병렬화 이득이 제한되는 경우가 있다.

모범 사례 요약

  • 덤프는 가능한 custom 또는 directory 형식으로 생성한다.
  • 복원 전에 서버 설정을 임시로 조정해 인덱스 생성과 WAL 비용을 최소화한다.
  • -j 값은 테스트를 통해 최적값을 찾는다. 일반적으로 코어 수와 IO 성능을 고려한다.
  • 복원 후에는 반드시 ANALYZE와 설정 원복을 수행한다.
  • 작업을 자동화할 때는 복원 실패 시 원인 로그를 남기도록 구성한다.

결론

병렬 복원 postgres pg_restore는 대규모 복원 시간을 크게 줄일 수 있는 강력한 도구다. 그러나 단순히 병렬 수만 높이는 것으로는 충분하지 않다. 서버 설정, 덤프 형식, 객체 의존성, 디스크 및 CPU 특성을 함께 고려해야 최적의 결과를 얻는다. 제시한 절차와 체크리스트를 따라 단계적으로 적용하면 restore 성능 튜닝 postgres 효과를 안정적으로 확보할 수 있다.

병렬 복원 postgres pg_restore pg_restore 병렬 옵션 사용법 restore 성능 튜닝 postgres PostgreSQL 복원 pg_restore 성능 병렬 처리 복원 백업 복원 최적화 pg_dump pg_restore