autovacuum_freeze_max_age
| 버전 | 기본값 | context | 타입 |
|---|---|---|---|
| 14 | a relatively low 200 million transactions | postmaster (재시작) | integer |
| 15 | a relatively low 200 million transactions | postmaster (재시작) | integer |
| 16 | a relatively low 200 million transactions | postmaster (재시작) | integer |
| 17 | a relatively low 200 million transactions | postmaster (재시작) | integer |
| 18 | a relatively low 200 million transactions | postmaster (재시작) | integer |
| 19 | a relatively low 200 million transactions | postmaster (재시작) | integer |
테이블의 pg_class.relfrozenxid가 도달할 수 있는 최대 나이를 transaction 수 단위로 정한다. 이 나이를 넘기면 transaction ID(XID) wraparound를 막기 위해 VACUUM이 강제로 실행된다. 기본값은 2억(200,000,000)이다.
PostgreSQL의 XID는 32비트라 언젠가 한 바퀴를 돈다. wraparound가 일어나기 전에 오래된 tuple을 freeze해 두지 않으면 과거 데이터가 미래 데이터로 보이는 참사가 나므로, 테이블 나이가 이 값에 도달하면 autovacuum이 off로 설정돼 있어도 시스템이 anti-wraparound vacuum을 강제로 띄운다. 이 vacuum은 pg_xact 하위 디렉토리의 오래된 commit 상태 파일도 정리할 수 있게 해 주는데, 기본값이 이론적 한계(약 20억)보다 훨씬 낮은 2억으로 잡혀 있는 이유가 이것이다. multixact 쪽 대응 파라미터로는 autovacuum_multixact_freeze_max_age가 있다.
서버 시작 시에만 설정할 수 있고, 개별 테이블의 storage parameter로는 값을 낮추는 방향으로만 덮어쓸 수 있다.
운영 노트:
age(relfrozenxid)가 이 값에 접근하는 테이블이 있는지 주기적으로 모니터링해야 한다. anti-wraparound vacuum은 미룰 수 없고 취소해도 다시 뜨기 때문에, 대형 테이블에서 업무 피크 시간에 시작되면 I/O 부담이 크다. 평소 vacuum이 제때 돌아 freeze가 꾸준히 진행되게 하는 것이 최선의 예방이다.출처: PostgreSQL 18 문서