Innovating today, leading tomorrow

OpenSQL_Technical Guide
[OpenSQL] pg_basebackup

[OpenSQL] pg_basebackup

pg_basebackup의 개요

pg_basebackup이란?

pg_basebackup is used to take a base backup of a running PostgreSQL database cluster. The backup is taken without affecting other clients of the database, and can be used both for point-in-time recovery and as the starting point for a log-shipping or streaming-replication standby server.
– PostgreSQL 공식 문서 –

pg_basebackup은 실행 중인 PostgreSQL 데이터베이스 클러스터의 기본 백업을 수행하는 데 사용됩니다. 백업은 데이터베이스의 다른 클라이언트에 영향을 주지 않으며 PITR과 Log-shipping 또는 Streaming Replication을 구성하는 데에 시작 점으로 사용할 수 있습니다.

pg_basebackup은 데이터베이스 클러스터 파일의 복사본을 만들면서 동시에 서버가 자동으로 백업 모드로 전환 되거나 종료되도록 합니다. 백업은 항상 전체 데이터베이스 클러스터에서 수행되며 개별 데이터베이스 또는 데이터베이스 오브젝트는 백업할 수 없습니다. 선택적 백업의 경우 pg_dump 와 같은 다른 도구를 사용해야 합니다.

백업은 복제 프로토콜을 이용하여 이루어지며, 복제 권한이 있거나 수퍼유저인 사용자를 사용하여 연결해야하고, pg_hba.conf가 복제 연결을 허용해야 합니다. 또한 서버는 백업 용 wal sender와 스트리밍용 wal sender가 하나 이상 사용할 수 있도록 max_wal_sender를 충분히 높게 설정해야 합니다.

동시에 여러 개의 pg_basebackup을 실행할 수 있지만, 일반적으로 성능 측면에서는 하나의 백업만 수행하고 결과를 복사하는 것이 좋습니다.
pg_basebackup이 기본 백업을 수행할 때마다 서버의 pg_stat_progress_basebackup 뷰에서 백업 진행 률을 확인할 수 있습니다.

Standby 서버 백업

pg_basebackup은 primary 서버 뿐만 아니라 standby 서버에서도 백업을 만들 수 있습니다. 백업을 실행하기 전에 다음을 설정해주어야 합니다.

  • standby 서버에서 max_wal_sender의 수 설정
  • standby 서버에서 hot_standby 설정
  • standby 서버에서 pg_hba.conf 구성
  • primary 서버에서 full_page_writes 사용하도록 설정

그리고 standby 상태에서 백업을 수행하는 데는 몇 가지 제한 사항이 있습니다.

  • 백업 된 데이터베이스 클러스터에 백업 기록 파일이 생성되지 않습니다.
  • pg_basebackup은 백업이 끝날 때 까지 새 WAL파일로 강제 전환할 수 없습니다. -X none 을 사용하고 primary 의 WRITE 작업이 거의 없는 경우, pg_basebackup은 백업에 필요한 마지막 WAL파일을 전환하고 아카이브 할 때까지 오랜 시간 기다려야 할 수 있습니다. 이 경우, 즉시 WAL 파일을 스위치 하려면 primary 서버에서 pg_switch_wal을 실행하는 것이 좋습니다.
  • 백업 도중에 standby 상태가 primary 상태로 승격되면 백업이 실패합니다.
  • 백업에 필요한 모든 WAL 레코드에는 충분한 full page write가 포함되어 있어야 하기 때문에 primary 서버에서 full_page_writes를 실행해주어야 합니다.

pg_basebackup 문법

pg_basebackup [option…]

pg_basebackup 옵션 (출력 위치/형식/연결)

옵션설명
-D directory –pgdata=directory출력을 쓸 대상 디렉토리를 설정합니다. 이 디렉토리가 존재하지 않으면 생성하며, 이미 존재하면 비어있어야 합니다. 이 옵션은 필수로 적어야합니다.
-F format –format=format출력 형식을 선택합니다. 사용 가능한 포맷은 다음과 같습니다. – p/plain : 원본 서버의 데이터 디렉터리 및 테이블스페이스와 동일한 레이아웃을 사용하여 일반 파일로 출력을 작성합니다. ( default) – t/tar : 출력을 대상 디렉토리에 tar파일로 작성합니다.
-R –write-recovery-confstandby.signal파일을 생성하고 대상 디렉터리의 postgresql.auto.conf 파일에 연결 설정을 추가합니다. 이렇게 하면 백업 결과를 사용하여 대기 서버를 쉽게 설정할 수 있습니다.
-t target –target=target기본 백업을 배치할 위치를 지정합니다. 기본 대상은 pg_basebackup이실행 중인 시스템으로 백업을 보내도록 지정하는 입니다. 서버에 백업을 저장하려면 수퍼유저 권한이 있거나 해당 역할의 권한이 있어야 합니다.
-T olddir=newdir –tablespace-mapping=olddirr백업하는 동안 olddir 디렉터리 의 테이블 스페이스를 재배치합니다.기본 대상 디렉토리와 마찬가지로 newdir 이미 존재할 필요는 없지만 존재하는 경우 비어 있어야 합니다. olddir 및 모두 newdir 절대 경로여야 합니다.
–waldir=waldirWAL(write-ahead log) 파일을 쓸 디렉토리를 설정합니다.
-X method –wal-method=method필수 WAL(Write-ahead log) 파일을 백업에 포함합니다. – n/none : 백업에 WAL 파일을 포함하지 않습니다. – f/fetch : WAL 파일은 백업이 끝날 때 수집됩니다. – s/stream : 백업을 수행하는 동안 WAL 데이터를 스트리밍합니다.
-z –gzip기본 압축 수준으로 tar 파일의 gzip 압축을 활성화합니다.
-Z level -Z [{client|server}-]method[:detail] –compress=level –compress=[{client|server}-]method[:detail]백업 압축을 요청합니다. client또는 server가 포함된 경우 압축을 수행할 위치를 지정합니다. 압축 수준을 지정하지 않으면 기본 압축 수준이 사용됩니다. 알고리즘을 언급하지 않고 레벨만 지정하면 gzip압축이 사용되고,레벨이 0이면 압축을 사용하지 않습니다.
-c {fast|spread} –checkpoint={fast|spread}체크포인트 모드를 fast (immediate) or spread (the default)으로 설정합니다.
-C –create-slot백업을 시작하기 전에 –slot옵션으로 지정한 복제 슬롯을 생성하도록 지정합니다. 슬롯이 이미 있으면 오류가 발생합니다.
-l label –label=label백업 레이블을 설정합니다. 아무것도 지정하지 않으면 ” pg_basebackup base backup” 의 기본값이 사용됩니다.
-n –no-clean기본적으로 pg_basebackup오류와 함께 중단되면 작업을 완료할 수 없음을 발견하기 전에 생성했을 수 있는 모든 디렉터리를 제거합니다.
-N –no-sync기본적으로 pg_basebackup은 모든 파일이 디스크에 안전하게 기록될 때까지 기다립니다. 이 옵션을 사용하면 기다리지 않고 반환하여 더 빠르지만 충돌로 인해 기본 백업이 손상될 수 있습니다.
-P –progress진행률 보고를 활성화합니다. 이 기능을 켜면 백업 중에 대략적인 진행률 보고서가 제공됩니다.
-r rate –max-rate=rate원본 서버에서 데이터를 수집하는 최대 전송 속도를 설정합니다.
-S slotname –slot=slotname이 옵션은 -X stream와 함께만 사용할 수 있습니다. WAL 스트리밍이 지정된 복제 슬롯을 사용하도록 합니다.
-v –verbose상세 모드를 지정합니다.
–manifest-checksums=algorithm백업 매니페스트에 포함된 각 파일에 적용해야 하는 체크섬 알고리즘을 지정합니다. 현재 사용 가능한 알고리즘은 NONE,  CRC32C,  SHA224,  SHA256, SHA384및 SHA512입니다. 기본 값은 CRC32C입니다.
–manifest-force-encode백업 매니페스트의 모든 파일 이름을 강제로 16진수로 인코딩합니다. 이 옵션을 지정하지 않으면 UTF8이 아닌 파일 이름만 16진수로 인코딩됩니다.
–no-estimate-size –no-manifest –no-slot –no-verify-checksums–no-estimate-size : 스트리밍 될 총 백업 데이터 양을 예측하지 못하도록 하여 pg_stat_progress_basebackup 뷰의 backup_total 컬럼이 항상 NULL이 됩니다. –no-manifest : 백업 매니페스트 생성을 비활성화합니다. –no-slot : 백업을 위한 임시 복제 슬롯이 생성되지 않도록 합니다. –no-verify-checksums : 기본 백업을 사용하는 서버에서 체크섬이 실행된 경우 체크섬 확인을 중지합니다.
-d connstr –dbname=connstr서버에 연결하는 데 사용되는 매개변수를 connection string으로 지정합니다
-h host –host=host서버가 실행 중인 시스템의 호스트 이름을 지정합니다
-p port –port=port서버가 연결을 수신하는 TCP 포트 또는 로컬 Unix 도메인 소켓 파일 확장자를 지정합니다. 
-s interval –status-interval=interval원본 서버로 다시 전송되는 상태 패킷 사이의 시간(초)을 지정합니다. 값이 작을수록 서버에서 백업 진행 상황을 보다 정확하게 모니터링할 수 있습니다.
-U username –username=username연결할 사용자 이름입니다.
-w –no-password암호 프롬프트를 표시하지 않습니다.
-W –password원본 서버에 연결하기 전에 pg_basebackup이 암호를 묻도록 합니다 .
-V –versionpg_basebackup 버전을 인쇄 하고 종료합니다.
-? –helppg_basebackup 커맨드 에 대한 도움말을 표시 하고 종료합니다.

pg_basebackup 사용 예시

  • 기본 백업 예시

[opensql@localhost:~]$ pg_basebackup -h mydbserver -D /usr/local/pgsql/data

  • 각 테이블스페이스에 대해 하나의 압축된 tar 파일 백업 생성하면서 진행률 보고서 표시

[opensql@localhost:~]$ pg_basebackup -D backup -Ft -z -P

  • 단일 테이블스페이스 로컬 데이터베이스의 백업을 생성하고 이를 bzip2 로 압축하려면 다음을 수행하십시오 .

[opensql@localhost:~]$ pg_basebackup -D – -Ft -X fetch | bzip2 > backup.tar.bz2

  • 테이블스페이스 재배치하면서 백업진행

[opensql@localhost:~]$ pg_basebackup -D backup/data -T /opt/ts=$(pwd)/backup/ts

  • 레벨 9에서 gzip 으로 압축된 각 테이블스페이스에 대해 하나의 tar 파일로 백업 생성
[opensql@localhost:~]$ pg_basebackup -D backup -Ft --compress=gzip:9

주의할 점

  1. 백업 시작 시, 원본 서버에서 체크포인트를 수행해야 합니다.
  2. 백업에는 PostgreSQL에서 관리하는 특정 임시 파일을 제외하고 데이터 디렉토리 및 테이블스페이스의 모든 파일이 포함됩니다. 그러나 테이블스페이스에 사용되는 심볼릭 링크는 백업 되지 않습니다.
  3. 테이블스페이스는 --tablespace-mapping 옵션을 쓰지 않는 한 소스 서버와 동일한 경로로 백업됩니다.
  4. pg_basebackup은 동일하거나 이전 major 버전(9.1 이하)의 서버에서 작동합니다. 단, WAL 스트리밍 모드( -X stream)는 서버 버전 9.3 이상에서만 작동하며 tar 형식( --format=tar)은 서버 버전 9.5 이상에서만 작동합니다.

pg_basebackup 환경변수

다음 환경변수들과 같이 pg_basebackup를 사용할 수 있습니다.

환경변수설명
PG_COLOR표시되는 메세지에서 색상을 사용할지 여부를 지정합니다. 사용 가능한 값은 다음과 같습니다.
– always
– auto
– never

대부분의 다른 PostgreSQL의 유틸리티와 마찬가지로 libpq에서 지원하는 환경변수를 사용합니다. libpq에서 지원하는 환경변수에 대한 내용은 여기 를 참고해주세요!!

사용 방법

export PGHOME=/opensql/pg #opensql engine directory
export PGDATA=/opensql/pg/$PGVERSION/data #opensql database clsuter directory
export PGHOST=/var/run/opensql #opensql socket directory
export PGUSER=postgres #opensql Basic DB User Name
export PGPASSFILE=’/opensql/.pgpass’ #opensql pgpass file

지금까지 ‘PostgreSQL pg_basebackup’에 관해 알아보았습니다

‘PostgreSQL pg_restore’을 바로 이어서 확인해보세요!