PostgreSQL New Feature는 시리즈로 구성됩니다.
- PostgreSQL 17 주요 기능 설명과 파라미터, 시스템 카탈로그 변화
- PostgreSQL 17 추가, 개선 기능
- PostgreSQL 17 Vacuum 성능 향상
- PostgreSQL 17 증분백업(Incremental Backup)
본 문서에서는 증분 백업 수행/복구하는 방법을 설명한 후, 증분 백업을 위한 WAL Summary 기능에 대한 내용을 기술합니다.
증분 백업(Incremental Backup)
증분 백업을 지원하지 않았던 PostgreSQL 16 까지는 데이터베이스 전체 백업을 기본으로 백업을 수행하였습니다. 따라서, 백업 수행할 때마다 데이터베이스 크기만큼의 백업 파일이 생성되었습니다. 또한, 백업 이후의 데이터를 복구하기 위하여 WAL 파일이 삭제되지 않게 아카이빙 해두고 이를 이용하여 복구를 수행할 수 있었습니다. 이러한 백업 과정은 시간이 많이 소요되고 필요한 스토리지 공간도 많이 필요하였습니다.
PostgreSQL 17부터는 증분 백업(Incremental Backup)을 지원하여 백업 과정의 시간과 스토리지 공간을 절약할 수 있습니다. 증분 백업을 위해서는 데이터베이스 전체 백업이 1회 필요하지만, 전체 백업 이후에는 마지막 백업 이후의 변경된 내용만 캡처하는 방식으로 백업이 수행됩니다. 즉, 전체 백업이든 다른 증분 백업이든 마지막 백업 이후에 수행된 변경 사항만 캡처합니다. 이는 변경 사항에 관계없이 전체 백업에 비해 백업 시간과 스토리지 소비를 크게 줄일 수 있습니다.
증분 백업을 위해 추가된 기능
pg_basebackup Utility 옵션 추가
증분 백업을 지원하기 위해 -i 옵션이 추가되었으며, 마지막 백업의 manifest file을 지정하여 수행합니다.
pg_combinebackup Utility 신규 추가
여러 증분 백업을 단일 백업으로 병합하기 위해 PostgreSQL 17에서 새롭게 추가된 Utility입니다.
주요 옵션 | 설명 |
-d, --debug | 디버그 로그 출력 |
-n, --dry-run | 병합을 실제로 수행하지 않고, 어떤 작업이 이루어질지 미리 확인 |
-o, --output=DIRECTORY | 재구성된 데이터 디렉토리를 저장할 경로를 지정 |
backup_directory | 병합할 증분 백업의 경로를 하나 이상 지정. |
시스템 파라미터 생성
파라미터 | 기본값 | 설명 |
summarize_wal | off | WAL Summary 기능 활성화 여부. on으로 설정되어야 증분 백업 가능 |
wal_summary_keep_time | 14400 (10d) | WAL Summary 파일 보관 주기 설정 |
증분 백업 수행
증분 백업 기능을 사용하기 위해서는
summarize_wal 시스템 파라미터를 활성화해야 합니다.증분 백업을 수행하기 전 기본(전체) 백업을 먼저 생성합니다.
기본(전체) 백업 후 데이터를 생성한 후 증분 백업을 수행합니다. 증분 백업 수행 시 주의해야 할 사항은 가장 마지막 백업의 backup_manifest를 사용해야 합니다. 이 단계에서 가장 마지막 백업은 기본(전체) 백업으로 base_backup의 backup_manifest를 지정해야 합니다.
다시 데이터를 추가한 후 증분 백업을 수행합니다. 증분 백업 수행 시 주의해야 할 사항은 가장 마지막 백업의 backup_manifest를 사용해야 합니다. 이 단계에서 가장 마지막 백업은 첫 번째 증분 백업으로 incremental_backup01의 backup_manifest를 지정해야 합니다.
증분 백업 복원
증분 백업 수행 단계에서 한 번의 기본(전체) 백업과 두 번의 증분 백업을 수행하였습니다. 이 백업들을 복원하고 복원된 데이터 디렉터리로 데이터베이스를 시작한 후 앞서 입력한 테스트 데이터가 존재하는지 확인합니다.
PostgreSQL 17에서 새롭게 생긴 pg_combinebackup Utility를 사용하여 모든 증분 백업을 결합하여 복원할 수 있습니다. 앞서 생성한 증분 백업을 pg_combinebackup Utility로 결합하여 /home/postgres/pg17.combine_backup 디렉터리로 복원합니다.
복원된 디렉터리에 존재하는 postgresql.conf 파일은 백업 대상의 postgresql.conf와 동일하게 구성됩니다. 복원된 디렉터리를 데이터 디렉터리로 사용하는 데이터베이스를 시작하기 위해서 postgresql.conf에서 Port를 변경한 후 데이터베이스를 시작합니다.
데이터베이스에 접속하여 데이터를 확인합니다. 앞서 테스트 데이터는 test01 테이블에 총 2,000,000 row가 저장되어 있습니다. c1=1인 데이터는 1,000,000 row, c1=2인 데이터는 1,000,000 row가 저장되어 있습니다.
Trouble Shooting
summarize_wal 파라미터를 활성화하지 않은 경우
summarize_wal 파라미터를 활성화하지 않은 경우 기본 백업은 가능하지만, 증분 백업은 불가능합니다.
summarize_wal=on 설정 후 증분 백업을 다시 수행하면 아래와 같은 에러 메시지가 발생합니다.기본 백업을 수행한 후 summarize_wal을 활성화하였기 때문에 증분 백업이 실패하게 됩니다. 따라서 summarize_wal을 활성화 한 이후 새로 기본 백업을 수행한 후 증분 백업을 수행해야 정상적으로 증분 백업이 가능합니다.
pg_combinebackup 수행 시 백업 디렉터리 나열을 순서대로 하지 않은 경우
pg_combinebackup 수행 시 백업 디렉터리 나열 순서는 백업 순서대로 나열해야 합니다. 백업 순서대로 백업 디렉터리를 나열하지 않은 경우 pg_combinebackup은 실패하여 에러가 발생하며 증분 백업 복원도 되지 않습니다.
기본 백업이 선두에 나열되지 않은 경우 (증분백업1 → 증분백업2 → 기본백업 순으로 나열)
증분 백업이 순서대로 나열되지 않은 경우 (기본백업 → 증분백업2 → 증분백업1 순으로 나열)
WAL Summary 기능
PostgreSQL 17에서 새롭게 생긴 walsummarizer 프로세스는 WAL과 관련된 새로운 Background 프로세스로 WAL 로그를 효율적으로 요약하고 통계를 수집하는 역할을 수행합니다.
WAL Summary 관련 파라미터
파라미터 | 카테고리 | 기본값 | 설명 |
summarize_wal | Write-Ahead Log > Summarization | off | WAL Summary 기능 활성화 여부 |
wal_summary_keep_time | Write-Ahead Log > Summarization | 14400 (10d) | WAL Summary 파일 보관 주기 설정 |
WAL Summary 기능 활성화를 위해서는
wal_level 파라미터를 replica 또는 logical로 설정해야 하고, PostgreSQL 17에서 새로 생긴 summarize_wal 파라미터를 on으로 활성화해야(기본값:off) 합니다.WAL Summary 기능이 활성화되면, walsummarizer 프로세스가 실행되어 pg_wal/summaries 디렉터리에 WAL Summary가 저장됩니다.
WAL Summary 파일은 PostgreSQL 17에서 새로 생긴
wal_summary_keep_time 파라미터에 의해 유지됩니다. wal_summary_keep_time 파라미터의 기본값은 14400분(10일)으로 WAL Summary 파일은 설정 값에 의해 10일이 지나면 자동으로 제거됩니다.테스트를 위해 테이블 생성 및 데이터를 입력한 후 강제로 WAL Summary 파일을 생성한 후 WAL Summary의 내용을 확인합니다.
CHECKPOINT를 발생시켜 WAL Summary 파일을 생성된 것을 확인할 수 있습니다. WAL Summary 파일의 내용은 편집기로 확인할 수 없고, PostgreSQL 17에서 새롭게 생성된 pg_walsummary Utility를 통해 확인할 수 있습니다.
pg_walsummary 결과를 보면
REL 16384가 test01 테이블이고, blocks 0.. 8을 통해 9개의 Block이 변경되었음을 확인할 수 있습니다. 이러한 내용은 아래 WAL Summary 함수 설명 시 확인할 수 있습니다.WAL Summary 파일 내용을 확인하기 위해서 아래와 같은 함수를 제공합니다.
함수 | 설명 |
pg_available_wal_summaries() | 각 WAL Summary 파일의 시작 LSN과 종료 LSN 반환 |
pg_wal_summary_contents( tli , start_lsn , end_lsn ) | 지정한 LSN 사이의 업데이트 정보 반환 |
pg_get_wal_summarizer_state() | WAL Summary 생성 상태 반환 |
pg_available_wal_summaries()
WAL Summary 파일의 시작 LSN과 종료 LSN은 함수를 수행하지 않아도 WAL Summary 파일명에서 유추할 수 있습니다.

pg_wal_summary_contents( tli , start_lsn , end_lsn )
컬럼 | 설명 |
relfilenode | Relation 파일 번호 (pg_class의 relfilenode 컬럼을 통해 Relation 이름 확인 가능) |
reltablespace | Relation의 테이블스페이스 oid (pg_tablespace의 oid 컬럼을 통해 테이블스페이스 이름 확인 가능) |
reldatabase | Relation의 데이터베이스 oid (pg_database의 oid 컬럼을 통해 데이터베이스 이름 확인 가능) |
relforknumber | Relation에서의 Fork 번호 |
relblocknumber | Relation에서의 Page 번호 (위 예시에서는 relfilenode = 16384인 Relation에 9개 블록이 수정되었음을 의미) |
is_limit_block | f : WAL 레코드에 의해 수정이 있었음을 표시t and relblocknumber > 0 : Relation Fork가 WAL 레코드 범위 내에서 relblocknumber로 지정된 길이로 Truncate 되었음을 표시t and relblocknumber = 0 : Relation Fork가 WAL 레코드 범위 내에서 생성되거나 삭제 되었음을 표시 |
Relation 이름 확인 (relfilenode)
테이블스페이스 이름 확인 (reltablespace)
데이터베이스 이름 확인 (reldatabase)
수정된 블록 개수 확인 (relblocknumber)
pg_get_wal_summarizer_state()
컬럼 | 설명 |
summarized_tli | walsummarizer 프로세스가 실행된 적이 없는 경우 : 0walsummarizer 프로세스가 실행된 경우 : 디스크에 기록된 마지막 WAL Summary 파일의 TLI(Timeline) 표시 |
summarized_lsn | walsummarizer 프로세스가 실행된 적이 없는 경우 : 0/0walsummarizer 프로세스가 실행된 경우 : 디스크에 기록된 마지막 WAL Summary 파일의 종료 LSN 표시 |
pending_lsn | walsummarizer 프로세스가 실행 중이 아닌 경우 : 0/0walsummarizer 프로세스가 실행 중인 경우 : 마지막 레코드의 종료 LSN 표시. (summarized_lsn 보다 크거나 같음) |
summarizer_pid | walsummarizer 프로세스가 실행 중이 아닌 경우 : NULLwalsummarizer 프로세스가 실행 중인 경우 : walsummarizer 프로세스의 PID |
함께 보면 좋은 아티클
