full_page_writes
| 버전 | 기본값 | context | 타입 |
|---|---|---|---|
| 14 | on | sighup | boolean |
| 15 | on | sighup | boolean |
| 16 | on | sighup | boolean |
| 17 | on | sighup | boolean |
| 18 | on | sighup | boolean |
| 19 | on | sighup | boolean |
checkpoint 이후 각 디스크 페이지가 처음 수정될 때 그 페이지 전체 내용을 WAL에 기록할지를 정한다. boolean 파라미터로 기본값은 on이며, postgresql.conf나 서버 커맨드라인에서만 설정할 수 있다.
이 기록이 필요한 이유는 OS crash 시점에 진행 중이던 페이지 write가 일부만 완료되어, 디스크 위 페이지에 옛 데이터와 새 데이터가 섞일 수 있기 때문이다(이른바 torn page). WAL에 평소 저장되는 행 수준 변경 데이터만으로는 이런 페이지를 crash 후 recovery에서 완전히 복원할 수 없다. full page image를 저장하면 페이지를 항상 올바르게 복원할 수 있지만, 그만큼 WAL 기록량이 늘어난다. WAL replay는 항상 checkpoint에서 시작하므로 checkpoint 이후 첫 변경 때 한 번만 기록하면 충분하고, 따라서 checkpoint 간격 파라미터를 늘리는 것이 full page write 비용을 줄이는 한 방법이다.
이 파라미터를 끄면 평상시 동작은 빨라지지만, 시스템 장애 후 복구 불가능한 데이터 손상 또는 조용한 데이터 손상이 생길 수 있다. 위험의 성격은 fsync를 끄는 것과 비슷하며(정도는 그보다 작다), 끄는 것이 허용되는 조건도 fsync와 같다. 끄더라도 point-in-time recovery(PITR)를 위한 WAL archiving 사용에는 영향이 없다.
운영 노트: torn page가 원천적으로 발생하지 않는 스토리지(atomic write가 보장되는 일부 파일시스템·장치)가 아니라면 끄지 않는 것이 원칙이다. WAL 양이 부담이라면 이 파라미터를 끄는 대신
checkpoint_timeout·max_wal_size를 늘려 full page image 발생 빈도를 낮추는 접근이 안전하다.출처: PostgreSQL 18 문서