old_snapshot_threshold
| 버전 | 기본값 | context | 타입 |
|---|---|---|---|
| 14 | — | postmaster (재시작) | integer |
| 15 | — | postmaster (재시작) | integer |
| 16 | — | postmaster (재시작) | integer |
쿼리 스냅샷이 “snapshot too old” 오류 위험 없이 사용될 수 있는 최소 시간을 정한다. 기본값 -1은 기능을 끈 상태로, 스냅샷 수명에 제한을 두지 않는다. 서버 시작 시에만 설정할 수 있다. 이 파라미터는 PostgreSQL 16까지만 존재하며, 17에서 제거됐다.
이 기능을 켜면 설정한 시간보다 오래 dead 상태였던 데이터를 오래된 스냅샷이 남아 있어도 vacuum이 정리할 수 있게 된다. 장시간 유지되는 스냅샷 때문에 bloat가 쌓이는 것을 막으려는 장치다. 대신 그 스냅샷이 임계 시간을 넘긴 뒤 그사이 수정된 페이지를 읽으려 하면, 잘못된 결과를 돌려주는 대신 “snapshot too old” 오류를 발생시킨다. 단위 없이 값을 주면 분으로 해석하며, 실무적으로 의미 있는 값은 몇 시간에서 며칠 수준이다.
부작용도 있다. 기능이 켜져 있으면 relation 끝의 빈 공간을 OS로 반환할 수 없고(오류 감지에 필요한 정보가 사라지기 때문), 시스템 카탈로그처럼 조기 vacuum이 안전하지 않은 테이블에는 효과가 없다. 또한 특정 상황에서 반드시 오류가 발생한다고 보장하는 메커니즘도 아니다.
운영 노트: 이 기능은 정확성 관련 문제가 이어져 PostgreSQL 17에서 제거됐다. 16 이하에서 사용 중이었다면 17로 마이그레이션할 때 설정을 제거해야 하며, 장기 스냅샷으로 인한 bloat는 idle 트랜잭션 정리(
idle_in_transaction_session_timeout 등) 쪽으로 접근하는 것이 현재의 권장 방향이다.출처: PostgreSQL 18 문서