전체 백업 pg_basebackup 사용중에 Unknown error 발생

스폰서 링크
PostgreSQL
스폰서 링크

pg_basebackup를 사용하여 온라인 전체 백업을 할 때, 다음과 같은 오류가 발생하는 경우가 있습니다. 버전 12, 13에서 발생하며 14에서는 오류가 수정되어 문제없이 사용할 수 있게 되었습니다. 이 글에서는 조사한 내용을 정리해 보았습니다.

pg_basebackup: error: could not stat file “base.tar.gz”: Unknown error

스폰서 링크

전제 조건

이 글은 Windows Server에 설치된 데이터베이스에서 발생한 에러를 설명합니다. PostgreSQL 서버 클러스터 설치에 대해서는 다음을 참조하십시오.

Windows Server 2019에서 PostgreSQL 13.5-1 Windows x64 버전 설치하기(인스톨러 사용)
Windows Server 2012 R2에 PostgreSQL 14 Windows x64 버전 설치하기(zip archive 사용)

온라인 가동 중에 전체 백업을 위해서는 다음과 같이 postgresql.conf의 WAL(Write Ahead Log) 아카이브 설정이 유효한 상태임을 확인합니다.

wal_level = replica
archive_mode = on
archive_command = 'copy %p C:\\app\\archivelog\\%f'

PostgreSQL 서버 클러스터의 환경 변수 정보는 다음과 같습니다.

SET PATH="C:\app\PostgreSQL\XX\bin";%PATH%
SET PGDATA=C:\app\data
SET PGDATABASE=postgres
SET PGUSER=postgres
SET PGPORT=5432
SET PGLOCALEDIR=C:\app\PostgreSQL\XX\share\locale

XX는 12 또는 13을 의미합니다. 매번 Password를 입력하는 것이 귀찮다면 SET PGPASSWORD=********를 설정합니다.

PosPostgreSQL 12, 13

조사용 인스톨러

조사용 인스톨러는 다음과 같습니다.

postgresql-12.8-2-windows-x64.exe
postgresql-13.5-1-windows-x64.exe

대량 데이터 작성

%PGDATA%에 대해 100GByte정도의 사용 가능한 공간을 확보한 후 다음 명령으로 대량의 데이터를 작성합니다.

C:\>pgbench -i -s 8000 -U postgres -d
Password:********
dropping old tables...
creating tables...
generating data...
100000 of 800000000 tuples (0%) done (elapsed 0.09 s, remaining 258.81 s)
200000 of 800000000 tuples (0%) done (elapsed 0.13 s, remaining 201.07 s)
300000 of 800000000 tuples (0%) done (elapsed 0.45 s, remaining 449.60 s)

... 중간 생략 ...
vacuuming...
creating primary keys...

작성된 대량 데이터 OID파일

대량 데이터 작성으로 만들어진 OID파일을 확인한 결과 각 파일의 크기는 1GByte를 넘지 않게 되어 있는 것 같습니다. 1Gbyte를 넘을 때마다 연속된 번호의 접미사를 붙여 새로운 파일이 추가 작성됩니다.

2022-04-30 05:42  1,073,741,824 16471

2022-04-30 05:43  1,073,741,824 16471.1
2022-04-30 05:43  1,073,741,824 16471.2
... 중간 생략 ...
2022-04-30 05:50      3,317,760 16471_fsm
2022-04-30 05:50        417,792 16471_vm

오류 내용

base.tar.gz 결과가 2GByte 이상으로 커지는 경우 다음 같이 오류가 발생합니다.

C:\>pg_basebackup -D C:\app\backup -F tar -X fetch -z
암호:*******
pg_basebackup: 오류: "C:\app\backup/base.tar.gz" 파일의 상태값을 알 수 없음: Unknown error

영문 메시지는 다음과 같습니다.

C:\>pg_basebackup -D C:\app\backup -F tar -X fetch -z
Password:*******
pg_basebackup: error: could not stat file "C:\app\backup/base.tar.gz": Unknown error

PostgreSQL 14

postgresql-14.2-2-windows-x64.exe를 인스톨하여 PosPostgreSQL 12, 13와 같은 방법으로 조사한 결과, 오류는 발생하지 않았습니다.

해결책

PostgreSQL14의 오픈 소스에는 위 PostgreSQL12, 13의 오류를 해결하기 위해 다음과 같은 내용이 적용되어 있습니다. PostgreSQL12, 13 오픈 소스를 컴파일 할 수 있는 개발 환경을 구축할 수 있다면 다음 파일을 적용하여 문제를 해결할 수 있습니다.

Fix our Windows stat() emulation to handle file sizes > 4GB. · postgres/postgres@bed9075
Hack things so that our idea of "struct stat" is equivalent to Windows' struct __stat64, allowing it to have a wide enou...

적용 소스는 다음과 같습니다.

configure
configure.ac
src/include/port/win32_port.h
src/port/dirmod.c
src/port/win32stat.c [new file]
src/tools/msvc/Mkvcbuild.pm

관련 토론 내용은 다음을 참조 하십시오.

Discussion: https://postgr.es/m/1803D792815FC24D871C00D17AE95905CF5099@g01jpexmbkw24
Discussion: https://postgr.es/m/15858-9572469fd3b73263@postgresql.org

제목과 URL을 복사했습니다