pg_verifybackup을 사용한 PostgreSQL 백업 검증
요약
본 문서는 PostgreSQL 13부터 도입된 `pg_verifybackup` 도구를 사용하여 데이터베이스 백업의 무결성을 검증하는 방법을 설명합니다. 이 도구는 `pg_basebackup`으로 생성된 백업과 함께 제공되는 매니페스트(Manifest) 파일을 비교하여 파일의 존재 여부, 이름 변경, 내용 수정 등의 변화를 식별할 수 있습니다.
핵심 포인트
- `pg_verifybackup`은 백업 무결성 검증에 사용됩니다.
- 매니페스트는 백업 파일의 경로, 크기 등 정보를 담은 JSON 문서입니다.
- 파일 누락이나 추가 파일 존재 시 오류를 감지합니다.
- 파일 내용 수정(checksum 변경)도 검출할 수 있습니다.
Pg_verifybackup은 PostgreSQL 13에서 도입되었으며, Pg_basebackup으로 생성된 기본 백업(base backup)의 무결성을 서버가 생성하는 backup_manifest 파일과 비교하여 확인하는 데 사용됩니다.
Manifest는 백업 파일에 대한 정보(경로, 크기, 마지막 수정 시간 등)를 포함하는 JSON 문서입니다. 선택적으로 체크섬도 포함될 수 있습니다. 예시:
{ "PostgreSQL-Backup-Manifest-Version": 2,
"System-Identifier": 7694938432524117566,
"Files": [
...
pg_verifybackup은 이 파일의 정보를 사용하여 백업을 검증합니다. 하지만 이 도구가 데이터베이스가 성공적으로 복원될 것이라고 보장할 수는 없습니다. 이는 백업의 특정 측면적인 무결성과 일관성만을 확인합니다.
백업 생성 및 검증
먼저, pg_basebackup을 사용하여 백업을 생성해 보겠습니다:
[postgres@OEL98-PG ~]$ pg_basebackup -D /backup/ -v
pg_basebackup: initiating base backup, waiting for checkpoint to complete
...
이제 백업을 검증해 보겠습니다:
[postgres@OEL98-PG ~]$ pg_verifybackup /backup/ -P
740739/740739 kB (100%) verified
backup successfully verified
출력 결과는 검증이 성공적으로 완료되었음을 나타냅니다.
누락 및 추가 파일 식별하기
만약 백업 내의 파일을 이름 변경하면, pg_verifybackup은 그 변화를 식별합니다. 예를 들어:
[postgres@OEL98-PG ~]$ mv /backup/global/1213 /backup/global/1213-old
이제 명령을 다시 실행해 보겠습니다:
[postgres@OEL98-PG ~]$ pg_verifybackup /backup/ -P
pg_verifybackup: error: "global/1213-old" is present on disk but not in the manifest
pg_verifybackup: error: "global/1213" is present in the manifest but not on disk
...
두 가지 오류가 발생했습니다. 첫 번째는 추가 파일(1213-old)이 디스크에 존재하지만 매니페스트에는 없는 경우를 나타내고, 두 번째는 예상되는 파일(1213)이 누락되었음을 나타냅니다.
진행률은 100%에 도달했지만, 오류가 감지되었기 때문에 검증은 실패했습니다.
이제 원래의 파일 이름으로 복원해 보겠습니다:
[postgres@OEL98-PG ~]$ mv /backup/global/1213-old /backup/global/1213
Identifying Modified Files
다음 단계에서는 파일을 수정하고 이 도구를 다시 실행하려고 합니다.
먼저, 파일의 세부 정보를 확인해 보겠습니다:
[postgres@OEL98-PG 16384]$ ll /backup/base/16384/3456
-rw-------. 1 postgres postgres 122880 Oct 10 10:42 /backup/base/16384/3456
이제 파일의 내용을 수정해 보겠습니다:
[postgres@OEL98-PG ~]$ printf 'curropt' |dd of=/backup/base/16384/3456 bs=1 seek=100 conv=notrunc status=none
도구를 다시 실행합니다:
[postgres@OEL98-PG ~]$ pg_verifybackup /backup/ -P
pg_verifybackup: error: checksum mismatch for file "base/16384/3456"
740739/740739 kB (100%) verified
체크섬 검증에 실패했으며, 이는 파일의 내용이 매니페스트에 기록된 내용과 다르다는 것을 식별합니다. 이는 파일이 수정되었음을 나타내지만, 반드시 우발적인 손상이 발생했다는 의미는 아닙니다.
하지만 --skip-checksums를 사용하여 데이터 파일 체크섬 검증을 건너뛸 수 있습니다:
[postgres@OEL98-PG ~]$ pg_verifybackup /backup/ -P --skip-checksums
backup successfully verified
체크섬을 건너뛰는 것이 수정된 파일을 복구하지는 않습니다. 이는 데이터 파일 체크섬 검증을 비활성화하는 것이므로, 이 성공적인 결과가 백업이 온전하다는 것을 의미하지는 않습니다. 파일 존재 여부, 파일 크기, WAL(Write-Ahead Log) 검증과 같은 다른 확인 사항은 별도로 비활성화되지 않는 한 계속 수행됩니다.
WAL 검증 (WAL Verification)
pg_verifybackup의 더 복잡한 기능 중 하나는 WAL 검증입니다. 이 도구는 매니페스트 파일의 WAL-Ranges 섹션을 사용하여 필요한 WAL 레코드를 검증합니다. 예를 들면:
"WAL-Ranges": [
{ "Timeline": 1, "Start-LSN": "0/4A000118", "End-LSN": "0/4A000328" }
],
각 범위는 Timeline, Start-LSN, 그리고 End-LSN이라는 세 가지 중요한 필드를 포함합니다. PostgreSQL의 pg_verifybackup은 필수적인 WAL 레코드를 구문 분석하기 위해 보조 유틸리티인 pg_waldump를 호출합니다. 이 과정에서 매니페스트로부터 얻은 timeline과 start 및 end LSN을 사용하여, 오류만 보고되도록 조용한 모드(quiet mode)로 실행됩니다. 성공적인 WAL 검사는 모든 레코드가 복구 중 올바른 작업을 수행할 것이라는 것을 증명하지는 않습니다. 이는 필수적인 WAL 레코드를 읽고 구문 분석할 수 있는지 여부를 확인하는 것이지만, 모든 상황에서 복구가 성공할 것이라고 보장할 수는 없습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기