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