[PostgreSQL] 아카이브 모드 백업을 이용한 전체 복구 시나리오

참고


절차

  • 서버가 실행중이라면 서버를 중지합니다.
  • 운영에 사용되던 기존 경로에 있던 파일들을 다른 경로로 저장합니다. (원본 파일은 항상 보관하도록 설정)
  • 기존 경로에 있던 폴더/파일을 전부 삭제합니다.
  • 백업받은 파일(pg_wal 경로 제외)을 기존 위치에 복사합니다. 이 때 파일 소유자나 권한 등은 동일해야 합니다. pg_wal 경로는 복구작업을 진행하면서 자동으로 만들어집니다.
  • 만약 WAL 백업파일이 없다면, 2단계에서 복사한 pg_wal 경로의 로그파일을 기존 경로로 복사합니다.
  • 데이터베이스 클러스터 디렉터리 안에 recovery.signal 파일을 만듭니다.
  • 서버를 실행합니다.
  • 서버가 복구모드로 구동되면서 필요한 WAL 파일을 찾아 반영되지 않은 트랜잭션을 반영합니다.
  • 해당 절차는 특정시점 복구 없이 마지막 WAL 파일까지 복구하는 방식입니다.

아카이브 모드 백업을 이용한 전체 복구 시나리오

  • 아카이브 모드 백업을 이용한 전체 복구 시나리오를 정리해 보도록 하겠습니다.

Docker 컨테이너 실행

  • PostgreSQL Docker-Compose 를 실행합니다.
> docker-compose up


계정 변경

  • 계정 변경을 진행합니다.
root@d5f06b09198b:/# su - postgres
postgres@d5f06b09198b:~$

경로 생성

  • 아카이브 파일을 백업 받을 경로를 생성합니다.
postgres@d5f06b09198b:~$ mkdir /var/lib/postgresql/data/arch
postgres@d5f06b09198b:~$ mkdir /var/lib/postgresql/data/backup


아카이브 모드 설정

  • postgresql.conf 파일에서 아카이브 모드를 설정합니다.
wal_level=replica
archive_mode=on
archive_command='cp %p /var/lib/postgresql/data/arch/%f' 
archive_timeout=60
log_destination=stderr
log_directory='pg_log'
logging_collector=on
log_filename='postgresql-%Y-%m-%d_%H%M%S.log'

서버 재기동

  • 앞서 postgresql.conf 파일을 수정하였기 때문에, 서버를 다시 재 시작 해야 합니다.
> docker-compose stop
> docker-compose restart

테스트 진행할 테이블 및 데이터 삽입

  • 테스트를 진행하기 위해서 테이블 생성 및 데이터를 삽입합니다.
  • 다음과 같이 test_tbl1 테이블을 생성 후, 총 20개의 데이터를 삽입 하였습니다.
postgres@d5f06b09198b:~$ psql -U test -d abc
psql (14.3 (Debian 14.3-1.pgdg110+1))
Type "help" for help.

abc=# create table test_tbl1(id int, name varchar(255));
CREATE TABLE
abc=# insert into test_tbl1 SELECT generate_series(1,10) AS id, md5(random()::text) AS descr;
INSERT 0 10
abc=# insert into test_tbl1 SELECT generate_series(1,10) AS id, md5(random()::text) AS descr;
INSERT 0 10
abc=# select count(1) from test_tbl1
abc-# ;
 count
-------
    20
(1 row)

basebackup 수행

  • 이제 pg_basebackup 을 수행합니다.
  • pg_basebackup 을 진행하기 위해서는 아래와 같이 명령어를 입력하면 됩니다.
postgres@d5f06b09198b:~$ pg_basebackup -U test -p 5432 -D /var/lib/postgresql/data/backup
  • 다음과 같이 /var/lib/postgresql/data/backup 디렉터리 검색 결과 전체 데이터 백업이 된 것을 확인할 수 있습니다.
postgres@d5f06b09198b:~$ ls -al /var/lib/postgresql/data/backup
total 256
drwxr-xr-x 1 postgres postgres   4096 Jul  6 00:50 .
drwx------ 1 postgres root       4096 Jul  6 00:42 ..
-rw------- 1 postgres postgres      3 Jul  6 00:49 PG_VERSION
drwxr-xr-x 1 postgres postgres   4096 Jul  6 00:49 arch
drwxr-xr-x 1 postgres postgres   4096 Jul  6 00:49 backup
-rw------- 1 postgres postgres    225 Jul  6 00:49 backup_label
-rw------- 1 postgres postgres 181885 Jul  6 00:49 backup_manifest
drwx------ 1 postgres postgres   4096 Jul  6 00:49 base
-rw------- 1 postgres postgres     47 Jul  6 00:49 current_logfiles
drwx------ 1 postgres postgres   4096 Jul  6 00:49 global
drwx------ 1 postgres postgres   4096 Jul  6 00:49 pg_commit_ts
drwx------ 1 postgres postgres   4096 Jul  6 00:49 pg_dynshmem
-rw------- 1 postgres postgres   4821 Jul  6 00:49 pg_hba.conf
-rw------- 1 postgres postgres   1636 Jul  6 00:49 pg_ident.conf
drwx------ 1 postgres postgres   4096 Jul  6 00:49 pg_log
drwx------ 1 postgres postgres   4096 Jul  6 00:49 pg_logical
drwx------ 1 postgres postgres   4096 Jul  6 00:49 pg_multixact
drwx------ 1 postgres postgres   4096 Jul  6 00:49 pg_notify
drwx------ 1 postgres postgres   4096 Jul  6 00:49 pg_replslot
drwx------ 1 postgres postgres   4096 Jul  6 00:49 pg_serial
drwx------ 1 postgres postgres   4096 Jul  6 00:49 pg_snapshots
drwx------ 1 postgres postgres   4096 Jul  6 00:49 pg_stat
drwx------ 1 postgres postgres   4096 Jul  6 00:49 pg_stat_tmp
drwx------ 1 postgres postgres   4096 Jul  6 00:49 pg_subtrans
drwx------ 1 postgres postgres   4096 Jul  6 00:49 pg_tblspc
drwx------ 1 postgres postgres   4096 Jul  6 00:49 pg_twophase
drwx------ 1 postgres postgres   4096 Jul  6 00:49 pg_wal
drwx------ 1 postgres postgres   4096 Jul  6 00:49 pg_xact
-rw------- 1 postgres postgres     88 Jul  6 00:49 postgresql.auto.conf
-rwxrwxrwx 1 postgres postgres  28867 Jul  6 00:49 postgresql.conf
-rwxrwxrwx 1 postgres postgres  28867 Jul  6 00:49 postgresql.conf.bak

다시 test_tbl1 테이블에 10개의 데이터 삽입

  • 앞서 20개의 데이터를 가진 정보를 백업 해 놓았습니다.
  • 이제 다시 test_tbl1 테이블에 10개의 데이터를 삽입합니다.
postgres@d5f06b09198b:~$ psql -d abc -p 5432 -U test
psql (14.3 (Debian 14.3-1.pgdg110+1))
Type "help" for help.

abc=# insert into test_tbl1 SELECT generate_series(1,10) AS id, md5(random()::text) AS descr;
INSERT 0 10
abc=# select count(1) from test_tbl1;
 count
-------
    30
(1 row)

서비스 중단

  • 이제 데이터 복구를 하기 위해서 서비스를 중단 합니다.
> docker-compose stop

원본 데이터 백업

  • 로컬에 볼륨 마운트 된 경로에 back_data_20220706 이라는 폴더를 만들고 해당 경로 안에 원본 데이터를 백업 시켜 놓습니다.


기존 경로 데이터 전부 삭제

  • 백업을 하였다면, 기존 경로 데이터를 전부 삭제 합니다.

원본 데이터 다시 기존 경로에 복사

  • back_data_20220706 디렉터리 안에 있는 데이터를 다시 전부 복사합니다.

recovery.signal 파일 생성

  • 볼륨 마운트 진행된 경로에 recovery.signal 파일을 하나 생성합니다.

    참고로, 복구가 정상적으로 진행되면 recovery.signal 파일은 자동 삭제 됩니다.


postgresql.conf 파일 수정

  • 다음으로 postgresql.conf 파일을 열어 restore_command 를 찾아 다음과 같이 내용을 작성합니다.
restore_command = 'cp /var/lib/postgresql/data/arch/%f %p'

서버 재기동

  • 이제 다시 Docker 컨테이너를 실행하여 PostgreSQL 서버를 재기동 합니다.
> docker-compose up

복구 확인

  • 정상적으로 복구가 되었는지 확인합니다.
  • 앞서 시나리오에서 10개의 로우를 총 3번 수행하였습니다.
  • 때문에 백업 시점에서 30개였고, 복구 시점 후 바로 확인 결과 30개 동일하게 나오는 것을 확인할 수 있습니다.
postgres@d30f0d5c801c:~$ psql -U test -p 5432 -d abc
psql (14.3 (Debian 14.3-1.pgdg110+1))
Type "help" for help.

abc=# select count(*) from test_tbl1;
 count
-------
    30
(1 row)
728x90

이 글을 공유하기

댓글

Designed by JB FACTORY