Profile picture

[Shell Script] PostgreSQL 데이터 백업 스크립트 작성하기

JaehyoJJAng2024년 03월 20일

▶︎ 개요

데이터 백업은 시스템을 운영함에 있어서 매우 중요한 작업 중 하나이다.

이번 포스팅에서는 PostgreSQL 데이터베이스에 대한 백업 전략을 세우고

백업 로직을 셸 스크립트로 구현해보도록 하겠다.


▶︎ 백업 전략

  • 빈도
    • 데이터의 중요도와 변동성에 따라 백업 빈도를 결정.
    • 매일 백업을 할 것인지?, 주간 혹은 월간 백업을 할 것인지를 결정
  • 자동화
    • 가능하다면 백업 프로세스를 관리자가 일일이 수동으로 하는 것이 아닌 자동화를 목표로 두어야 한다.
    • 휴먼 에러를 줄이고 일관된 백업을 유지.
  • 저장 장소
    • 로컬 서버뿐 아니라 다른 물리적 위치에도 백업을 저장하는 것이 좋다(분산)
    • 이를 통해 재해 복구에 더 유연하게 대처가 가능
  • 검증
    • 백업이 제대로 이루어졌는지 검증하는 단계가 포함되어야 한다.

▶︎ 백업 방법

‣ SQL 덤프(pg_dump)

  • 이 방법은 데이터베이스의 스냅샷을 SQL 파일로 저장한다.
  • 이 파일을 통해 데이터베이스를 복구할 수 있다.
pg_dump -U username -W -F c -b -v -f "20240321.pgsql" <DB NAME>

‣ 파일 시스템 레밸 백업

  • PostgreSQL 데이터 디렉토리를 직접 복사하여 백업을 수행할 수도 있다.
  • 이 방법은 데이터베이스가 현재 작동 중이지 않거나, 모든 트랜잭션이 끝난 상태에서 수행되어야 한다.
  • 또는 데이터베이스가 컨테이너로 실행된 상태에서 컨테이너의 데이터 폴더가 호스트와 마운트된 상황에서도 활용이 가능하다.
cp -R /var/lib/postgresql/9.3/main /app/MyStorage/backup/

‣ 증분 백업

  • pg_basebackup와 같은 도구를 사용하거나, WAL(Write-Ahead-Logging) 파일을 저장하여 증분 백업을 수행할 수 있다.
pg_basebackup -h localhost -D /app/MyStorage/backup/ -U username -v -P --wal-method=stream

▶︎ 복구 방법

‣ SQL 덤프 복구

pg_restorepsql 명령을 사용하여 SQL 덤프 파일로부터 데이터베이스를 복구할 수 있다.

# psql
psql -U username -d <DB NAME> < backup.sql

‣ 파일 시스템 레벨 복구

백업 디렉토리를 PostgreSQL 데이터 디렉토리로 복사하고, 서비스를 재시작한다.

cp -R /app/MyStorage/backup/* /var/lib/postgresql/9.3/main/

데이터 백업과 복구는 매우 중요한 작업이므로, 꼭 테스트 환경에서 충분히 실습 후 상용 환경에 적용하는 것을 추천한다.


▶︎ 복구 스크립트 작성

#!/usr/bin/bash

# 라인 지정
line() 
{ 
 	eval printf %.0s\= '{1..'${COLUMNS:-$(tput cols)}'}'; echo
}

section()
{ 
	line 
    printf "%*s\n" $(( (${#1}+$(tput cols)) /2 )) "$1" 
	line 
}

# 설정 변수
USERNAME="<YOUR_DB_USERNAME>"
DBNAME="<YOUR_DB_NAME>"
BACKUP_DIR="/path/to/backupdir"

# 현재 날짜로 백업 파일 이름 지정
TODAY="$(date +'%Y%m%d')"
BACKUP_FILE="$BACKUP_DIR/backup_$TODAY.pgsql"

{
  section "데이터베이스 백업 수행 [$TODAY]"
  # 데이터베이스 백업 수행
  #pg_dump -U $USERNAME -F -c -b -v -f "$BACKUP_FILE" $DBNAME


  section "오래된 백업 파일 찾아 삭제 (일주일 이상)"
  # 오래된 백업 파일 찾아 삭제. (일주일 이상)
  #find "$BACKUP_DIR" -type f -name "backup_*.pgsql" -mtime +7 -exec rm {} \;

  section "백업 완료! [$(date +'%Y%m%d')]"
}

‣ .pgpass 파일 사용

PostgreSQL은 .pgpass 파일을 이용하여 비밀번호에 대한 보안을 지킬 수 있다.

이 파일을 만들고 적절한 권한을 설정해주면 pg_dump 명령어가 자동으로 해당 파일을 참조한다.

아래 작업을 따라해보자.


1. 사용자의 홈 디렉토리에 .pgpass 파일을 생성

touch ~/.pgpass

2. 해당 파일에 데이터베이스 접속 정보를 작성

echo "hostname:port:dbname:username:password" | tee -a ~/.pgpass

3. 파일의 권한 설정

chmod 0600 ~/.pgpass

▶︎ Crontab 설정

50 23 * * * /path/to/your_script_name.sh

▶︎ 마무리

스크립트 실행

chmod u+x backup_pgsql.sh
bash backup_pgsql.sh

image


Loading script...