▶︎ 개요
데이터 백업은 시스템을 운영함에 있어서 매우 중요한 작업 중 하나이다.
이번 포스팅에서는 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_restore
나 psql
명령을 사용하여 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