PostgreSQL 임시 파일 문제 진단 및 해결
PostgreSQL 임시 파일 문제의 원인 분석, 진단 절차, 즉시 복구 방법과 설정 변경 및 모니터링 방안을 정리한 기술자료
목차
소개
PostgreSQL 운영 중 디스크가 갑자기 차거나 성능 저하가 발생하면 임시 파일(temp file)이 원인일 때가 많다. 임시 파일은 정렬, 해시 조인, 복잡한 집계 등에서 생성된다. 이 글에서는 "postgres 임시 파일 문제"의 진단과 복구, 설정 변경과 예방까지 실무 관점에서 정리한다.
문제 개요
임시 파일이란
PostgreSQL이 메모리(work_mem)로 처리하기 어려운 연산을 디스크에 쓰는 파일이다. 일반적으로 pgsql_tmp* 형식으로 데이터 디렉토리 또는 지정된 임시 테이블스페이스에 생성된다.
발생 시 증상
- 디스크 용량 급감
- 쿼리 응답 지연·시간 초과
- 데이터베이스 재시작 또는 오류 로그에 관련 메시지 기록
원인 분석
주요 원인
- 과도한 정렬이나 대용량 조인으로 인한 임시 파일 생성
- work_mem 등 메모리 설정이 낮아 디스크 사용이 늘어난 경우
- 임시 파일이 생성되는 디렉토리의 디스크 부족
- 비효율적인 쿼리(인덱스 부재, 비정상적인 조인 순서)
진단 절차
1) 현재 상태 확인
디스크 사용량과 PostgreSQL 자체 통계를 함께 확인한다. 먼저 파일시스템 수준에서 임시 파일 위치를 점검한다.
df -h /var/lib/postgresql
du -sh /var/lib/postgresql/data/base/* | sort -h
2) PostgreSQL 통계 확인
pg_stat_database의 temp 관련 항목으로 어느 데이터베이스에서 임시 파일이 많이 생성되는지 확인한다.
psql -c "SELECT datname, temp_files, temp_bytes FROM pg_stat_database ORDER BY temp_bytes DESC;"
psql -c "SELECT pid, usename, datname, query_start, state, query FROM pg_stat_activity WHERE state = 'active' LIMIT 20;"
3) 임시 테이블스페이스와 설정 확인
임시 파일이 특정 테이블스페이스에 쓰이도록 설정했는지와 파일 크기 제한 설정을 점검한다.
psql -c "SHOW temp_tablespaces;"
psql -c "SHOW temp_file_limit;"
psql -c "SHOW work_mem; SHOW maintenance_work_mem;"
즉시 복구 방법
디스크 공간 긴급 확보
- 불필요한 로그나 오래된 백업을 다른 저장소로 이동
- 가능하면 PostgreSQL을 안전하게 재시작하여 순간적으로 해제되는 임시 파일 확보
재시작 전에는 연결 중인 세션과 작업을 고려해 미리 알림을 수행한다.
임시 파일 위치를 별도 장치로 이동
임시 파일이 디스크 I/O에 민감하면 빠른 별도 디스크로 임시 테이블스페이스를 지정한다.
psql -c "CREATE TABLESPACE temp_ts LOCATION '/mnt/fast/tmp';"
psql -c "ALTER DATABASE mydb SET temp_tablespaces = 'temp_ts';"
SELECT pg_reload_conf();
설정으로 근본 해결
work_mem 조정
대량 정렬이나 해시 조인이 많은 쿼리가 있다면 session 단위 또는 사용자/DB 단위로 work_mem을 늘려 임시 파일 발생을 줄일 수 있다. 다만 동시 세션 수를 고려해 전체 메모리 사용량을 계산해야 한다.
temp_file_limit 설정
한 세션이 생성할 수 있는 임시 파일 총량을 제한해 전체 시스템 영향을 줄일 수 있다. 단, 제한을 너무 낮게 설정하면 정상 쿼리가 실패할 수 있다.
psql -c "ALTER SYSTEM SET temp_file_limit = '2GB';"
psql -c "SELECT pg_reload_conf();"
모니터링과 예방
모니터링 항목
- pg_stat_database의 temp_bytes 변화
- 디스크 사용량 추세
- 장시간 실행 쿼리 목록
정기 점검 절차
정기적으로 임시 파일이 많이 발생하는 쿼리를 찾아 쿼리 튜닝 또는 인덱스 적용을 한다. 또한 임시 테이블스페이스를 별도 디스크로 분리하고 temp_file_limit 및 work_mem을 서비스 특성에 맞춰 조정한다.
결론
임시 파일 문제는 증상과 원인을 빠르게 파악하면 비교적 단기간에 해결 가능하다. 파일시스템 확인, PostgreSQL 통계 분석, 설정 변경, 그리고 모니터링 체계를 갖추면 재발을 줄일 수 있다. 운영 환경에 맞게 temp_tablespaces와 메모리 설정을 조정하는 것이 핵심이다.