Study

[DB]PostgreSQL 백업

seomj 2024. 10. 8. 21:00

PostgreSQL Backup 방법 3가지에 대해 정리해보자.

  • SQL 덤프
  • 파일 시스템 기반 백업
  • 아카이브 모드 백업

실습을 진행해보진 않았으면 조사 과정에서 정리해둔 내용을 기록하고자한다.

추후 기회가 된다면 실습하여 내용을 추가하겠다.


SQL 덤프

pg_dump와 pg_dumpall 명령어를 사용한다.

 

pg_dump

: 데이터베이스 하나만 dump 가능하다. 

$ pg_dump dbname > dumpfile
$ psql dbname < dumpfile

 

DB 파일이 크다면 압축을 이용할 수 있다. 

$ pg_dump dbname | gzip > filename.gz

$ gunzip -c filename.gz | psql dbname
$ cat filename.gz | gunzip | psql dbname

 

 

pg_dumpall

: PostgreSQL의 모든 데이터베이스를 dump 가능하다. 

$ pg_dumpall > dumpfile
$ psql -f dumpfile postgres

 

모든 데이터베이스를 dump 하기 때문에 따로 DB 이름을 설정하지 않는다. 

 

 

파일 시스템 기반 백업

데이터베이스 데이터를 저장하는 데 사용하는 파일을 직접 복사한다.

$ tar -cf backup.tar /usr/local/pgsql/data

 

하지만 이를 위해 데이터베이스 서버를 종료해야 한다. 

데이터베이스의 일부만 백업하는 것이 불가능하며, 전체 백업만 가능하다.

 

다른 방식으로는 스냅샷을 통해 백업이 가능하다. 

 

 

아카이브 모드 백업

WAL 파일 기반 동작한다.

 

WAL(Write ahead log)

데이터 변경 사항을 데이터베이스에 적용하기 전에 로그에 먼저 기록하는 시스템

이는 데이터베이스의 데이터 파일에 대한 모든 변경 사항을 기록하기 때문에 로그 항목을 통해 데이터베이스 복원이 가능하다.

 

데이터 베이스 조작 시 순차적인 WAL 레코드를 만든다. 16MB의 WAL 세그먼트 파일로 나뉘어 저장한다.

파일 이름은 WAL 순서에 따른 해당 번호 파일로 부여한다. 

 

WAL 아카이브 파일을 만들지 않도록 (아카이브 모드 비활성화) 설정하면 일정 갯수만 만들어지고 사용하지 않는 로그 파일을 로테이션 방식으로 재사용한다.

max_wal_size와 min_wal_size 설정에 따라 시스템에서 일정 수의 WAL 파일을 유지한다. 오래된 파일들은 새로운 트랜잭션이 발생할 때 재사용되며, 과거의 로그 정보가 덮어 씌워진다.

 

 

하지만 이는 전체 데이터베이스 복원만 지원하며, 많은 보관 저장소가 필요하다. 

 

postgresql.conf

wal_level =  replica(default) or logical or minimal
archive_mode = on
archive_command = 완료된 WAL 파일 세그먼트를 아카이브하기 위해 실행하는 로컬 쉘 명령으로 사용자가 지정
  • wal_level
    • minimal: 아카이브 모드나 복제가 필요하지 않은 환경에서 사용
    • replica: 스트리밍 복제와 물리적 백업을 지원, 읽기 전용 복제 슬레이브를 구축하거나 백업에서 복구할 때 사용
    • logical: PITR(Point-in-Time Recovery)을 위한 모든 정보 기록, 데이터베이스의 특정 테이블을 논리적으로 복제하거나 복제된 데이터를 특정 시점에 복구하는 등 더 세밀한 제어 가능

WAL 아카이브를 활성화하려면 replica 이상으로 설정해야 한다.

 

베이스(전체) 백업

pg_basebackup 사용

참고로 pg_dump와 pg_dumpall은 논리적 백업을 생성하고 WAL 재생에서 사용할 수 있는 충분한 정보를 제공하지 않기 때문에 사용할 수 없다. 

 

복구

PostgreSQL 버전이 11이하라면 recovery.conf를 사용한다.

그러나 12버전부터는 recovery.conf 파일이 postgresql.conf와 병합되어 사용한다. 일반 서버 구성 매개 변수를 사용하여 구성한다. recovery.conf가 존재하면 서버가 시작되지 않는다고 한다.

 

  1. 서버 중지
  2. 여유 공간이 있다면 클러스터 데이터 디렉터리와 테이블스페이스를 임시 위치에 복사한다. 공간이 부족하다면 최소한 pg_wal 서브 디렉터리의 내용을 저장한다.
  3. 기존 파일 삭제
  4. 데이터 복구
    • 전체 백업 - 데이터베이스 파일을 대상 디렉터리에 복원한다. 
    • 증분 백업 - 실행 중인 서버가 종료될 대상 디렉토리가 아닌 별도의 디렉토리에 배치한 후 pg_combinebackup을 사용하여 전체 백업과 이후의 모든 증분 백업에서 데이터를 가져와 대상 디렉토리에 합성 전체 백업을 작성한다. 
    • 소유권과 권한 확인
    • 테이블스페이스를 사용하는 경우 pg_tblspc/의 심볼 링크 확인 
  5. pg_wal/ 파일 모두 제거한다. 2번째에서 저장한 보관되지 않은 WAL 파일이 있는 경우 pg_wal/에 복사한다. 
  6. postgresql.conf에서 복구  설정을 적용하고, recovery.signal 파일을 클러스터 데이터 디렉터리에 생성한다. 
  7. 서버 시작: 서버가 복구 모드로 전환되며 필요한 WAL 파일을 읽는다. 복구가 완료되면 recovery.signal을 제거하고 정상적인 데이터베이스 작업을 시작한다. 
  8. 복구 확인

반드시 restore_command를 지정해야 한다.

이는 PostgreSQL에 아카이브된 WAL 파일 세그먼트를 검색하는 방법을 알려준다. 

$ restore_command = 'cp / mnt/server/archivedir/%f %p'

이전에 아카이브된 WAL 세그먼트를 /mnt/server/archivedir 디렉토리에 복사하라는 내용의 쉘 명령이다.

 

일반적으로는 데이터베이스를 현재 시점으로 복원한다. 하지만 이전 시점으로 복구하려면 필요한 중지 지점을 지정하면 된다. 날짜/시간, 명명된 복원 지점 또는 특정 트랜잭션 ID 완료에 따라 recovery target을 지정할 수 있다. 

 

 

정리

파일 시스템 백업 기반 방식의 경우 간단하면서 제약이 많아 따로 정리하지 않았다.

  SQL Dump WAL - 아카이브 WAL - 아카이브 X
백업 방식 논리적 백업 물리적 백업 물리적 백업
증분 백업 불가능 가능 가능
복원 시점 덤프 시점으로만 가능 특정 시점으로 가능 최근 시점으로 가능
백업 크기 전체 크기만큼 백업 변경된 내용만 백업 변경된 내용 + 지정한 WAL 개수만큼만 백업
백업 범위 특정 테이블이나 데이터만 선택 가능 데이터베이스의 모든 트랜잭션 데이터베이스의 모든 트랜잭션
이식성 다른 버전이나 다른 데이터베이스 가능 특정 버전 및 아카이브 모드에 종속 특정 버전 및 아카이브 모드에 종속

 

 

 

참고

https://www.postgresql.org/docs/current/backup-dump.html

https://www.postgresql.org/docs/current/backup-file.html

https://www.postgresql.org/docs/current/continuous-archiving.html

https://mozi.tistory.com/557

https://mozi.tistory.com/560