PostgreSQL 데이터베이스 클러스터 전체를 백업하기(pg_basebackup)

PostgreSQL

PostgreSQL 데이터베이스 클러스터 전체를 백업하는 방법을 소개합니다.

작업 환경

이 글은 다음과 같은 환경에서 확인했습니다. OS버전에 따라 화면 내용과 액세스 경로가 다를 수 있습니다. 꼭 확인 바랍니다. 참고로 이 글은 Linux 8 (CentOS 8, RHEL 8)에서도 실행 할 수 있습니다.

$ cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
$ /usr/bin/psql --version
psql (PostgreSQL) 12.7

PostgreSQL서버 설치에 대해서는 다음 글을 참조 하십시오.

postgres사용자로 로그인

다음과 같이 PostgreSQL권한을 가진 사용자로 로그인 합니다.

$ su - postgres
암호:*********
마지막 로그인: 수  7월 14 17:29:39 KST 2021 일시 pts/0
$ pwd
/var/lib/pgsql

백업용 디렉토리 작성하기

다음과 같이 fullbackup 디렉토리를 작성합니다.

$ mkdir fullbackup
$ ls -la
합계 16
drwx------.  4 postgres postgres   97  7월 14 22:23 .
drwxr-xr-x. 26 root     root     4096  7월 14 16:48 ..
-rw-------.  1 postgres postgres  133  7월 14 17:22 .bash_history
-rwx------.  1 postgres postgres  266  7월 14 16:48 .bash_profile
-rw-------.  1 postgres postgres 1077  7월 14 22:16 .psql_history
drwx------.  4 postgres postgres   51  7월 14 16:56 12
drwxr-xr-x.  2 postgres postgres   46  7월 14 22:25 fullbackup

pg_basebackup명령 실행하기

특징

  • PostgreSQL 데이터베이스 클러스터 전체를 백업합니다. 
  • PostgreSQL 데이터베이스에 접속 된 다른 클라이언트에 영향을 주지 않고 백업을 수행합니다. 
  • 개별 데이터베이스 또는 개별 데이터베이스 개체를 백업 할 수 없습니다. 개별 데이터베이스 백업은 pg_dump명령을 사용합니다.
  • SUPERUSER 또는 REPLICATION 의 ROLE 을 가진 사용자가 실행해야 합니다. 
$ psql

psql (12.7)
도움말을 보려면 "help"를 입력하십시오.

postgres=# SELECT current_database();
 current_database
------------------
 postgres

(1개 행)

postgres=# SELECT session_user;
 session_user
--------------
 postgres

(1개 행)
postgres=# \du postgres
                                롤 목록
 롤 이름  |                      속성                      | 소속 그룹:
----------+------------------------------------------------+------------
 postgres | 슈퍼유저, 롤 만들기, DB 만들기, 복제, RLS 통과 | {}

실행 예

$ YYYYMMDDHH24MISS=`date '+%Y%m%d%H%M%S'`
$ echo $YYYYMMDDHH24MISS
20210715234911
$ pg_basebackup -D /var/lib/pgsql/fullbackup/$YYYYMMDDHH24MISS -F tar -X fetch -z

명령 상세 설명

  • YYYYMMDDHH24MISS환경 변수에 현재 시간을 설정합니다.
  • -D /var/lib/pgsql/fullbackup/$YYYYMMDDHH24MISS 옵션은 backup 결과물을 저장하는 대상 디렉토리를 의미합니다. 지정한 디렉토리가 없다면 실행될 때 작성됩니다.
  • -F tar 옵션은 출력 형식을 선택합니다.  지정한 디렉토리에 tar 파일로 출력을 내 보냅니다. 주로 데이터 디렉토리 base.tar라는 파일에 내보내 다른 tablespace는 모든 테이블 공간의 OID에 따온 이름의 파일에 기록됩니다. 대상 디렉토리로 -(대시) 값이 지정된 경우, tar의 내용은 표준 출력에 기록됩니다. 이것은 예를 들어 gzip에 파이프에 적합합니다. 이것은 클러스터가 추가 테이블 공간을 가지지 않고, WAL 스트리밍을 사용하지 않는 경우에만 할 수 있습니다.
  • -X fetch 옵션은 “로그 선행 기입” Write Ahead Log(WAL)의 백업은 마지막에 수집 됩니다. 따라서 postgresql.conf의 wal_keep_segments 파라미터 값을 백업 끝까지 로그가 삭제되지 않을 정도로 충분히 커야 합니다. 로그의 전송 시점에서 로그를 rotate된 경우 백업이 실패하고 사용 할 수 없습니다. tar 형식 모드를 사용하면 미리 쓰기 로그 파일은 base.tar파일에 쓰여집니다.
  • -z 옵션은 tar 파일 출력의 기본 압축 레벨에 따른 gzip 압축을 사용합니다.  tar 파일을 생성하는 경우에만 압축을 사용할 수 모든 tar 파일 이름에 확장자 .gz가 자동으로 추가됩니다.

전체 백업 결과 확인

PostgreSQL 데이터베이스 클러스터 전체를 백업한 결과는 다음과 같습니다.

$ ls -la /var/lib/pgsql/fullbackup
합계 0
drwx------. 4 postgres postgres 50  7월 15 23:52 .
drwx------. 4 postgres postgres 97  7월 14 22:38 ..
drwx------. 2 postgres postgres 25  7월 15 23:52 20210715234911

$ echo $YYYYMMDDHH24MISS
20210715234911

$ ls -ls /var/lib/pgsql/fullbackup/$YYYYMMDDHH24MISS
합계 3004
3004 -rw-------. 1 postgres postgres 3073739  7월 15 23:52 base.tar.gz
제목과 URL을 복사했습니다