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

ASTRA 의 원격 PostgreSQL 백업 Backup 하기

·3 분· loading · loading ·
Seanbryu
Solution Techtopic Db Backup PostgreSQL ASTRA
InnoFactory
작성자
InnoFactory
스마트팩토리, 산업자동화, Digital Transformation, 디지털팩토리, PLM, ALM, Digital Manufacturing, Visualization, 3D CAD, Digital Twin, Big Data, IIoT 솔루션 전문업체
작성자
Sean Bongchoon Ryu
The Founder and CEO of InnoFactory

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 로 복구할 때 문제점들이 많이 발생합니다.

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

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

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

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