ASTRA 플랫폼이 다양한 데이터베이스를 지원합니다만 엔터프라이즈급에서 부담없이 쓰기에는 PostgreSQL 이 제일 좋다고 생각합니다. 우리회사에서 문서관리 및 협업시스템으로 사용하고 있는 ASTRA PDM 도 PostgreSQL 기반으로 운영되고 있습니다.
기업의 전산시스템은 일일백업 daily backup 이 거의 필수죠.
이 글은 우분투 Ubuntu 에서 운영되는 PostgreSQL 데이터베이스에 대한 일일백업 자동화에 대해 설명합니다.
PostgreSQL 의 백업 유틸리티에는 pg_dump
와 pg_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
는 와일드카드 *
을 사용할 수 있습니다.
username
과 password
는 반드시 입력되어야 합니다.
다음은 일반적인 .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
로 복구할 때 문제점들이 많이 발생합니다.
복구에 대한 내용은 다음 글에서 보다 상세히 다루도록 하겠습니다.
이 정도의 구현으로도 일일백업 자동화에 큰 문제는 없습니다만, 그대로 두면 매일 만들어지는 백업 파일 때문에 저장공간이 많이 부족해집니다.
백업에 앞서 오래된 백업을 삭제해주는 로직을 필요에 따라 넣으시면 좋은 해결책이 될 것 같습니다.
데이터베이스 이름이나 호스트명등을 쉘스크립트 옵션으로 만들어도 좋을것 같네요.