본문으로 건너뛰기
  1. Posts/

ASTRA 의 원격 PostgreSQL 백업 Backup 하기

·3 초· 0 · 0 ·
seanbryu
solution techtopic db backup PostgreSQL astra

ASTRA 플랫폼이 다양한 데이터베이스를 지원합니다만 엔터프라이즈급에서 부담없이 쓰기에는 PostgreSQL 이 제일 좋다고 생각합니다. 우리회사에서 문서관리 및 협업시스템으로 사용하고 있는 ASTRA PDM 도 PostgreSQL 기반으로 운영되고 있습니다.

기업의 전산시스템은 일일백업 daily backup 이 거의 필수죠.

이 글은 우분투 Ubuntu 에서 운영되는 PostgreSQL 데이터베이스에 대한 일일백업 자동화에 대해 설명합니다.

PostgreSQL 의 백업 유틸리티에는 pg_dumppg_dumpall 이 있는데, 이 글에서는 pg_dump 를 이용합니다.

개요 #

매일 일정시간에 특정위치에 날짜별로 디렉터리를 생성하고, DB 백업 파일을 저장할 계획입니다.

매일 일정시간에 작동하기 위하여 crontab 으로 백업 스크립트를 실행합니다.

PostgreSQL 클라이언트 설치 #

pg_dump 가 실행하려면 PostgreSQL 클라이언트가 설치되어 있어야 합니다.

PostgreSQL 클라이언트가 설치되어 있지 않다면, 다음 명령으로 설치해주세요.

sudo apt-get install -y postgresql-client

DB 비밀번호 파일 .pgpass 설정 #

.pgpass 파일은 DB 접속 비밀번호를 저장하고 있는 보안 파일입니다.

.pgpass 파일은 pg_dump 명령의 --no-password 옵션과 같이 사용됩니다. DB 접속시 비밀번호를 물어보지 않고, .pgpass 파일에 저장된 비밀번호를 사용합니다.

.pgpass 파일 생성 #

.pgpass 파일은 pg_dump 가 실행되는 위치에 있어야 적용이 됩니다.

vi 나 nano 와 같은 에디터를 이용해 파일을 만들어주세요.

.pgpass 파일 내용 형식은 다음과 같습니다.

hostname:port:database:username:password

hostname, port, database 는 와일드카드 * 을 사용할 수 있습니다. usernamepassword 는 반드시 입력되어야 합니다.

다음은 일반적인 .pgpass 파일 예시입니다.

#hostname:port:database:username:password
*:*:*:postgres:@123456!

파일 권한 변경 #

.pgpass 파일은 비밀번호가 들어있는 보안 파일이기 때문에 특정한 파일 권한을 요구합니다.

chmod 명령을 이용하여 .pgpass 파일의 권한을 변경하세요.

chmod 0600 .pgpass

백업 스크립트 생성 #

실제로 백업을 수행하는 postgres_daily_backup.sh 라는 이름의 쉘 스크립트 파일을 만들겁니다.

스크립트가 있는 위치로 이동 #

백업 스크립트의 위치를 고정하지 않고 사용하기 위해서는 백업 스크립트가 있는 위치로 먼저 이동을 한 후, 모든 명령들을 실행해야 합니다.

아래 코드가 스크립트 파일의 위치로 이동을 시켜줍니다.

RELATIVE_DIR=`dirname "$0"`

cd $RELATIVE_DIR

$0 는 명령어 자체를 의미합니다.

dirname 은 문자열에서 디렉터리 부분만을 추출합니다.

다음과 같이 명령이 실행되었다고 가정해 봅시다.

/nas/backup/postgres/postgres_daily_backup.sh

$0/nas/backup/postgres/postgres_daily_backup.sh 가 됩니다.

dirname "$0"/nas/backup/postgres 를 추출하여 RELATIVE_DIR 변수에 저장합니다.

일별 디렉터리 생성 #

오늘 날짜로 백업파일을 저장할 디렉터리를 생성해봅시다.

아래 코드가 일일 백업용 디렉터리를 생성해줍니다.

today="$(date +'%Y%m%d')"
mkdir "$today"

today 에는 20230830 양식의 문자열이 저장됩니다.

백업 파일명 생성 #

날짜가 들어가 있는 파일명을 만들어 볼 차례입니다.

아래의 단순한 코드로 파일명을 생성할 수 있습니다.

bk_filename="astra_$today.tar"

앞쪽의 예시를 빌려오자면, bk_filename 에는 astra_20230830.tar 라는 파일명이 저장됩니다.

백업 명령 실행 #

진짜 백업 명령어를 실행해보시죠.

우리가 실행할 백업 명령어 예시는 다음과 같습니다.

pg_dump --dbname=astra --host=111.222.1.1 --port=5432 --username=postgres --no-password --format=tar --file="$today/$bk_filename"

--dbname 에는 데이터베이스이름을 지정하세요.

--host 에는 PostgreSQL 이 실행되는 서버명 또는 IP 를 지정하세요.

--port 에는 접속포트를 지정하세요. 지정하지 않으면 기본 포트가 사용됩니다.

--username 에는 사용자명을 넣으세요.

--no-password 는 비밀번호를 묻지않고, .pgpass 파일에서 비밀번호를 가져오는 옵션입니다.

--format 에는 tar 로 지정하세요. tar 파일 포맷으로 백업파일이 생성됩니다.

--file 에는 백업파일의 이름을 지정하세요.

스크립트 완성본 예시 #

위 내용들을 모두 담은 스크립트 완성본의 예시입니다.

postgres_daily_backup.sh 로 저장하시고 사용하시면 됩니다.

#!/bin/bash
 
RELATIVE_DIR=`dirname "$0"`

cd $RELATIVE_DIR

today="$(date +'%Y%m%d')"
mkdir "$today" 

bk_filename="astra_$today.tar"

pg_dump --dbname=astra --host=111.222.1.1 --port=5432 --username=postgres --no-password --format=tar --file="$today/$bk_filename"

crontab 에 스크립트 등록 #

드디어 마지막 단계네요. 이제 백업 스크립트를 crontab 에 등록만 하면 됩니다.

매일 새벽 01:05 에 실행하도록 설정할겁니다.

다음 명령으로 crontab 편집 모드로 들어가세요.

crontab -e

편집기가 열리면 다음과 같이 수정 및 저장을 하고, 편집기를 닫으시면 됩니다.

백업저장소의 ROOT 디렉터리가 /nas/backup/postgres 라고 가정합니다.

05 01 * * * /nas/backup/posgres/postgres_daily_backup.sh

마무리 #

사실 pg_dump 로 백업할 때 보다는 pg_restore 로 복구할 때 문제점들이 많이 발생합니다.

복구에 대한 내용은 다음 글에서 보다 상세히 다루도록 하겠습니다.

이 정도의 구현으로도 일일백업 자동화에 큰 문제는 없습니다만, 그대로 두면 매일 만들어지는 백업 파일 때문에 저장공간이 많이 부족해집니다.

백업에 앞서 오래된 백업을 삭제해주는 로직을 필요에 따라 넣으시면 좋은 해결책이 될 것 같습니다.

데이터베이스 이름이나 호스트명등을 쉘스크립트 옵션으로 만들어도 좋을것 같네요.