[PostgreSQL] 아카이브 모드 백업을 이용한 전체 복구 시나리오
- Database(데이터베이스)
- 2022. 7. 8. 00:40
참고
절차
- 서버가 실행중이라면 서버를 중지합니다.
- 운영에 사용되던 기존 경로에 있던 파일들을 다른 경로로 저장합니다. (원본 파일은 항상 보관하도록 설정)
- 기존 경로에 있던 폴더/파일을 전부 삭제합니다.
- 백업받은 파일(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
'Database(데이터베이스)' 카테고리의 다른 글
[PostgreSQL] AutoVacuum 동작 테스트 (0) | 2022.07.10 |
---|---|
[PostgreSQL] 아카이브 모드 백업을 이용한 특정 시점 복구 시나리오(Point In Time Recovery(PITR)) (0) | 2022.07.10 |
[PostgreSQL] 아카이브 모드 백업 (0) | 2022.07.07 |
[PostgreSQL] PostgreSQL pg_basebackup 사용방법 (0) | 2022.07.07 |
[PostgreSQL] pgAdmin Docker 로 실행 후, Login Sessing 유지하는 방법 (0) | 2022.07.05 |
이 글을 공유하기