Postgres 백업 요약

백업은 데이터베이스에 필수적입니다. 데이터를 백업하는 다양한 방법이 있으며 이 문서에서는 다양한 도구를 요약합니다.

pg_dump/pg_restore

pg_dump pg_dumpall은 데이터베이스를 스크립트 파일 또는 다른 아카이브로 추출합니다.。这种备份被分类为逻辑备份,其大小可能比物理备份小得多。这部分是由于索引未存储在SQL转储中。从逻辑备份还原时,只存储CREATE INDEX命令,并且必须重建索引。

SQL 덤프 방법의 한 가지 장점은 출력 데이터 파일을 최신 버전의 Postgres로 다시 로드할 수 있다는 것이므로 이 덤프 및 복원 방법은 종종 버전 업그레이드 및 마이그레이션에서 선택됩니다. 또 다른 이점은 이러한 도구가 백업을 위해 특정 데이터베이스 개체를 지정하고 다른 개체는 무시할 수 있다는 것입니다. 예를 들어 테스트 환경에서 테이블의 특정 하위 집합만 백업해야 하는 경우입니다. 또는 데이터베이스가 실행되는 동안 위험한 단일 테이블 백업을 수행하십시오.

Postgres는 데이터베이스가 동시에 사용되는 경우에도 일관된 백업을 생성합니다. 다른 사용자가 데이터베이스에 액세스(읽기 또는 쓰기)하는 것을 차단하지 않습니다. 이는 덤프가 내부적으로 일관성이 있음을 보여줍니다. 즉, 덤프가 덤프가 시작된 시점의 데이터베이스 스냅샷을 나타냅니다. 덤프는 다른 작업을 차단하지 않지만 백업이 오래 실행될 수 있습니다(하드웨어 및 데이터베이스 크기에 따라 몇 시간 또는 며칠). Postgres가 동시성을 달성하기 위해 사용하는 방법(다중 버전 동시성 제어)으로 인해 장기 실행 백업은 덤프가 완료될 때까지 Postgres 성능 저하를 유발할 수 있습니다.

단일 데이터베이스 테이블을 덤프하려면 다음과 같은 명령을 실행할 수 있습니다.

pg_dump -t my_table > table.sql

위의 백업을 복원하려면 다음 명령을 실행하십시오.

psql -f table.sqld

물론 덤프 도구의 매개 변수는 그 이상입니다. pg 공식 웹 사이트 설명서 http://postgres.cn/docs/11/app-pgdump.html을 참조할 수 있습니다.

pg_dump는 파일을 생성하면서 전체 데이터 세트를 순차적으로 스캔합니다. 전체 데이터베이스 읽기는 인덱스가 아닌 모든 테이블 데이터에 대한 기본적인 손상 검사입니다. pg_dump는 데이터가 손상된 경우 예외를 발생시킵니다. pg_dump는 내부적으로 명령문을 실행합니다 SELECT. pg_dump를 실행하는 데 문제가 있는 경우 psql에서 시도하여 사용 중인 데이터베이스에서 데이터를 가져오고 있는지 확인하십시오.

서버 및 파일 시스템 백업

rsyncLinux 관리자의 경우 데이터베이스를 실행하는 전체 시스템을 백업하기 위해 또는 기타 도구를 사용하는 것이 일반적입니다 . Postgres는 실행 중인 동안 파일 지향 도구로 안전하게 백업할 수 없으며 쓰기를 쉽게 중지할 방법이 없습니다. 데이터베이스를 rsync를 사용하여 데이터에 액세스할 수 있는 상태로 만들려면 데이터베이스를 중단하거나 변경 사항 아카이브를 설정하는 모든 작업을 수행해야 합니다.

물리적 백업 및 WAL 아카이빙

기본 덤프 파일 외에도 보다 정교한 Postgres 백업 방법은 데이터베이스의 미리 쓰기 로그(WAL) 파일 저장에 의존합니다. WAL은 모든 데이터베이스 블록의 변경 사항을 추적하여 기본 크기 16MB의 세그먼트에 저장합니다. 서버의 연속적인 WAL 파일 모음을 WAL 스트림이라고 합니다. 데이터베이스를 안전하게 복사하기 전에 WAL 스트림의 파일 보관을 시작한 다음 "기본 백업"(예: pg_basebackup) 생성 프로세스를 수행해야 합니다. WAL은 복구가 가능하도록 점진적으로 백업할 수 있으며 물론 이러한 복구는 특정 시점 복구 도구를 기반으로 합니다.

pg_basebackup 유틸리티를 사용하여 기본 백업을 만듭니다.

$ sudo -u postgres pg_basebackup -h localhost -p 5432 -U postgres \
	-D /var/lib/pgsql/15/backups -Ft -z -Xs -P -c fast
  • postgres이 명령은 사용자로 실행 해야 합니다 .
  • -D이 매개변수는 백업을 저장할 위치를 지정합니다.
  • -Ft매개변수는 백업 파일 저장 방법이 tar 형식을 사용함을 나타냅니다.
  • -Xs매개변수는 WAL 파일이 백업으로 스트리밍됨을 나타냅니다. 이는 백업이 진행되는 동안 많은 WAL 활동이 있을 수 있고 해당 시간 동안 해당 파일을 기본에 유지하고 싶지 않기 때문에 중요합니다. 이것은 기본 동작이지만 지적할 가치가 있습니다.
  • -z이 매개변수는 tar 파일이 압축되고 tar 형식을 사용할 때만 압축이 가능하며 접미사가 .gz모든 tar 파일 이름에 자동으로 추가됨을 나타냅니다.
  • -P매개변수는 실시간 인쇄 백업의 진행률을 나타냅니다.
  • fast -c매개변수는 체크포인트를 즉시 가져가는 것을 의미합니다. 이 매개변수를 지정하지 않으면 Postgres가 자체적으로 체크포인트를 트리거할 때까지 백업이 시작되지 않습니다.

명령을 입력하는 즉시 백업이 즉시 시작됩니다. 클러스터 크기에 따라 완료하는 데 다소 시간이 걸릴 수 있습니다. 그러나 백업 작업은 데이터베이스에 대한 다른 연결을 방해하지 않습니다.

pg_basebackup을 사용하여 백업에서 복원하는 단계

  • 데이터베이스가 닫혀 있는지 확인하십시오.
$ sudo systemctl stop postgresql-15.service
$ sudo systemctl status postgresql-15.service
  1. 재해를 시뮬레이트하기 위해 Postgres 데이터 디렉터리의 콘텐츠를 삭제합니다.
  • $ sudo rm -rf /var/lib/pgsql/15/data/*
    
  • base.tar.gz를 데이터 디렉토리로 추출하십시오.
$ sudo -u postgres ls -l /var/lib/pgsql/15/backups
total 29016
-rw-------. 1 postgres postgres   182000 Nov 23 21:09 backup_manifest
-rw-------. 1 postgres postgres 29503703 Nov 23 21:09 base.tar.gz
-rw-------. 1 postgres postgres	17730 Nov 23 21:09 pg_wal.tar.gz


$ sudo -u postgres tar -xvf /var/lib/pgsql/15/backups/base.tar.gz \
     -C /var/lib/pgsql/15/data
  • 데이터 디렉터리 외부의 새 디렉터리에 pg_wal.tar.gz를 추출합니다. 이 경우 백업 디렉터리에 pg_wal이라는 디렉터리가 생성됩니다.
$ sudo -u postgres ls -l /var/lib/pgsql/15/backups
total 29016
-rw-------. 1 postgres postgres   182000 Nov 23 21:09 backup_manifest
-rw-------. 1 postgres postgres 29503703 Nov 23 21:09 base.tar.gz
-rw-------. 1 postgres postgres	17730 Nov 23 21:09 pg_wal.tar.gz

$ sudo -u postgres mkdir -p /var/lib/pgsql/15/backups/pg_wal

$ sudo -u postgres tar -xvf /var/lib/pgsql/15/backups/pg_wal.tar.gz \
      -C /var/lib/pgsql/15/backups/pg_wal/
  • recovery.signal 파일을 만듭니다.
$ sudo -u postgres touch /var/lib/pgsql/15/data/recovery.signal
  • postgresql.conf에서 restore_command를 설정하여 백업 중에 스트리밍된 WAL 파일을 복사합니다.
$ echo "restore_command = 'cp /var/lib/pgsql/15/backups/pg_wal/%f %p'" | \
      sudo tee -a /var/lib/pgsql/15/data/postgresql.conf
  • 데이터베이스를 시작하십시오.
$ sudo systemctl start postgresql-15.service sudo systemctl status
postgresql-15.service
  • 데이터베이스는 이제 이전 기본 백업에 포함된 정보를 기반으로 실행됩니다.

pgBackRest

이것은 매우 강력한 백업 도구입니다. pgBackRest에 의존하는 대규모 Postgres 환경이 많이 있습니다.

pgBackRest는 세 가지 유형의 백업을 수행할 수 있습니다.

  • 전체 백업 - DB 클러스터의 전체 콘텐츠를 백업에 복사합니다.
  • 차등 백업 - 마지막 전체 백업 이후 변경된 DB 클러스터 파일만 복사
  • 증분 백업 - 마지막 전체, 차등 또는 증분 이후 변경된 DB 클러스터 파일만 복사합니다.

pgBackRest에는 다음과 같은 몇 가지 특수 기능이 있습니다.

  • 특정 시점으로 돌아갈 수 있음 - PITR(Point in Time Recovery)
  • 이미 존재하고 WAL 세그먼트를 기반으로 업데이트되는 데이터베이스 파일을 사용할 증분 복원을 만듭니다. 이렇게 하면 특히 큰 데이터베이스가 있고 전체 데이터베이스를 복원할 필요가 없는 경우 복원 속도가 빨라집니다.

  • 다중 백업 리포지토리 지원 - 중복성을 위해 로컬 또는 원격을 말합니다.

archive_command아카이브와 관련하여 사용자는 pgBackRest를 사용하여 WAL 파일을 외부 아카이브에 복사하도록 매개변수를 설정할 수 있습니다 . 필요한 데이터 보존 정책에 따라 파일 만료 시간 또는 무제한 보존을 설정합니다.

설치 후 pgBackRest를 시작하려면 다음 명령을 실행하십시오.

$ sudo -u postgres pgbackrest --stanza=demo --log-level-console=info stanza-create

증분 복원을 수행하려면 다음을 수행하십시오.


$ sudo systemctl stop postgresql-15.service
$ sudo -u postgres pgbackrest \
--stanza=db --delta \
--type=time "--target=2022-09-01 00:00:05.010329+00" \
--target-action=promote restore

 복원이 완료되면 데이터베이스를 다시 시작하고 사용자 테이블이 복원되었는지 확인하십시오.


$ sudo systemctl start postgresql-15.service
$ sudo -u postgres psql -c "select * from users limit 1"

백업 타이밍

pgBackRest에는 특정 요구 사항을 충족하는 정책을 설정하기 위한 몇 가지 설정 옵션과 구성이 있습니다. 백업 전략은 복구 지점 목표, 사용 가능한 스토리지 및 기타 요소를 비롯한 여러 요소에 따라 달라집니다. 올바른 솔루션은 이러한 요구 사항에 따라 달라집니다. 올바른 전략은 복구 시간, 사용된 스토리지, 원본 데이터베이스의 IO 오버헤드 및 기타 요인 간의 균형을 맞추는 것입니다.

일반적인 권장 사항은 pgBackRest의 백업 및 WAL 보관 기능을 결합하는 것입니다. 고객은 일반적으로 WAL 파일을 지속적으로 보관하는 것 외에도 매주 전체 기본 백업을 수행하고 pg_dump와 같은 다른 형태의 증분 백업을 고려하는 것이 좋습니다.

결론적으로

논리적 백업        물리적 백업
pgdump         pgbasebackup pgbackrest
데이터 백업
지정된 테이블 또는 스키마 백업 × ×
DDL/스키마 √         √   √  
서로 다른 버전 간 마이그레이션 √   × ×
특정 시점으로 복원 × × √  
증분/차등 백업 × × √  

추천

출처blog.csdn.net/hezhou876887962/article/details/129466904