PostgreSQL WAL(Write-Ahead Logging) 로그 관리 가이드
PostgreSQL의 WAL(Write-Ahead Logging) 로그가 가득 차지 않도록 유지하려면 몇 가지 설정을 조정해야 합니다. 특히, 자동 체크포인트 설정, WAL 보존 주기 설정, 아카이빙 정책 등을 관리하면 WAL 크기를 제어할 수 있습니다. 해당 기능을 찾아보게 된 이유는 업무 중 AWS에 서비스 배포 및 이관 시 WAL 로그가 저장되는 PV(Persistent Volume) 의 크기에 제약이 있어, 해당 Pod 가 중지되는 현상이 발생했습니다. 따라서 해결 방법을 찾아 기록하기 위해 이 글을 남깁니다.
1. WAL 로그 크기 관리 기본 설정
WAL 파일이 너무 많이 쌓이지 않도록 하려면, 다음 설정들을 postgresql.conf
에서 조정하면 됩니다.
(1) max_wal_size
및 min_wal_size
조정
이 두 설정은 WAL 파일이 차지하는 최대 및 최소 크기를 제어합니다.
max_wal_size
: WAL이 이 크기를 초과하면 체크포인트가 트리거됩니다.min_wal_size
: 이 크기보다 작은 WAL 파일은 삭제됩니다.
예시 (기본값보다 작은 크기로 설정):
min_wal_size = 1GB # 최소 WAL 크기 (기본값: 80MB)
max_wal_size = 2GB # 최대 WAL 크기 (기본값: 1GB)
- 값이 작으면 WAL이 빠르게 삭제되지만, 성능이 조금 떨어질 수 있음.
- 값이 크면 성능은 향상되지만, 디스크 사용량 증가 가능.
(2) checkpoint_timeout
조정 (체크포인트 빈도)
체크포인트는 WAL 파일을 정리하는 역할을 합니다. checkpoint_timeout
을 줄이면 WAL 파일이 더 자주 삭제됩니다.
checkpoint_timeout = 5min # 기본값: 5min (더 짧게 설정 가능)
- 이 값을 줄이면 WAL이 빨리 삭제되지만, 너무 짧으면 성능이 떨어질 수 있음.
- 대개 5~10분이 적절한 값.
(3) checkpoint_completion_target
조정
체크포인트의 완료 시간을 조정하여 성능을 최적화할 수 있습니다.
checkpoint_completion_target = 0.7 # 기본값: 0.9
- 1.0에 가까울수록 부하를 분산시키지만, WAL이 오래 유지됨.
- 0.5~0.7 정도로 설정하면 WAL 삭제가 빨라짐.
2. WAL 파일이 계속 쌓이는 문제 해결
(1) WAL 아카이빙 비활성화 (archive_mode
)
WAL 아카이빙이 활성화되어 있으면 WAL 파일이 삭제되지 않고 계속 저장됩니다.
아카이빙이 필요 없다면 다음 설정을 확인하세요.
archive_mode = off
archive_mode = on
이면archive_command
로 설정된 위치에 WAL이 보관됨.- 백업 기능을 사용하지 않는다면
off
로 설정하는 것이 좋음.
(2) WAL 보존 주기 설정 (wal_keep_size
)
wal_keep_size
는 복제 슬롯(replication slot) 없이 유지할 WAL 크기를 지정합니다.
wal_keep_size = 512MB # 기본값: 0 (제한 없음)
- 기본값이 0이면 WAL이 무제한으로 유지될 수 있음!
512MB ~ 1GB
정도로 설정하면 적절함.
(3) 사용하지 않는 replication slot 정리
복제 슬롯이 있으면 WAL이 삭제되지 않을 수 있습니다.
현재 replication slot 확인:
SELECT * FROM pg_replication_slots;
사용하지 않는 슬롯 삭제:
SELECT pg_drop_replication_slot('slot_name');
active = false
인 슬롯은 삭제해도 됨.- 불필요한 슬롯을 제거하면 WAL 공간을 확보할 수 있음.
3. 불필요한 WAL 파일 수동 삭제
(1) pg_archivecleanup
사용 (아카이빙 활성화된 경우)
만약 아카이빙이 활성화되어 있다면, pg_archivecleanup
을 사용하여 불필요한 WAL 파일을 삭제할 수 있습니다.
pg_archivecleanup /path/to/archive WAL_segment
이 명령어는 /path/to/archive
폴더에서 지정한 WAL 세그먼트 이후의 파일을 삭제합니다.
(2) pg_resetwal
사용 (강제 초기화)
만약 WAL 파일이 너무 많아져서 긴급하게 삭제해야 한다면, pg_resetwal
을 사용할 수도 있습니다.
pg_resetwal -f /var/lib/postgresql/data
- 주의: 이 명령어는 WAL 로그를 강제 삭제하므로 데이터 무결성에 영향을 줄 수 있습니다.
4. 설정 변경 후 적용 방법
PostgreSQL을 재시작하거나 설정을 다시 로드해야 변경 사항이 적용됩니다.
SELECT pg_reload_conf(); -- 설정 파일 다시 로드 (재시작 없이 적용 가능)
또는 컨테이너 환경에서는 다음 명령어를 실행하세요.
docker restart <container_id_or_name>
결론
- WAL 크기 제한 (
max_wal_size
,min_wal_size
설정) - 체크포인트 주기 조정 (
checkpoint_timeout
,checkpoint_completion_target
) - WAL 보존 설정 (
wal_keep_size
,archive_mode
) - 사용하지 않는 replication slot 제거
- 불필요한 WAL 파일 삭제 (
pg_archivecleanup
등 활용)
'Coding > PostgreSQL' 카테고리의 다른 글
[PostgreSQL/TimescaleDB] Hypertable과 Chunk를 포함한 최소 크기 덤프 방법 (0) | 2025.02.17 |
---|---|
[PostgreSQL] 데이터베이스 용량 조회 방법 (0) | 2025.02.17 |
[PostgreSQL] 데이터베이스를 물리적으로 다른 서버에 있는 동일 데이터베이스로 옮기는 방법 (0) | 2025.02.17 |
[PostgreSQL] PostgreSQL에서 SELECT 컬럼 수가 성능에 미치는 영향 (0) | 2025.02.17 |
[PostgreSQL] ASC 인덱스가 있는데 DESC 인덱스를 추가해도 될까? (0) | 2025.02.16 |