본문 바로가기

Linux

데이터 베이스 서버 백업 쉘스크립트

백업 정책

서버는 언젠가 멈춘다. 그 순간을 대비하기 위해 중요한 설정 정보나 데이터를 다른 곳에 저장을 해두어야 한다.

정책 내용 방법

무엇을 웹: 웹소스, 서버 주요 설정  
데이터베이스: 데이터, 서버 주요 설정    
스토리지: 서버 주요 설정 tar볼로 묶어서 보관  
db덤프는 maria전용 백업툴 mariabackup을 사용    
스토리지는 데이터 용량이 크기 때문에 향후 이중화    
언제 하루에 한번 트래픽이 가장 적은 시간대 새벽 3시~5시
어디에 스토리지 BACKUP 디렉토리
  각 서버 이름(hostname)디렉토리 | /mnt/BACKUP/서버의호스트이름 |
 

백업 과정과 스크립트

#! /bin/bash

## 변수설정
HOST="${/usr/bin/hostname}"
LOG="/tmp/backup.log"
PUSH="/root/SHELL/monitor/tel_push.sh"
DATE="$(/bin/date +%Y.%m.%d)"

# 백업할 디렉토리/파일을 지정 (이 파일들을 아래 이름으로 압축)
BACK_LIST="/etc/my.chf.d"
# 백업 파일명
BAK_FILE="${BAK_PATH}/${DATE}_${HOST}.tgz"

# 디비백업 디렉토리(이 파일들을 아래 이름으로 압축)
DB_BAK_PATH="/root/SHELL/BACKUP/xtrabackup_backupfiles"
# 디비백업 파일명
DB_BAK_FILE="${BAK_PATH}/${DATE}_${HOST}_DB.tgz"

# 백업디렉토리 (스토리지서버)
BAK_PATH="/mnt/BACKUP/${HOST}"

##스토리지에 마운트
/usr/bin/mount /mnt

## 로그파일생성
/usr/bin/touch "${LOG}"

## 백업 디렉토리 확인
if [ -e "${BACK_PATH}" ]
then
        # 백업 디렉토리가 존재한다면
        /bin/echo "백업 디렉토리가 있어요"
else
        # 백업디렉토리가 없으면 생성
        /usr/bin/mkdir -p "${BAK_PATH}"
fi

## ---로그기록시작
{
				#백업 시작 시간
        /bin/echo
        /bin/echo "===백업시작 시각 :"
        /bin/date
        /bin/echo

        ## 백업
        # DB dump
        /usr/bin/mariabackup \\
                --backup \\
                --no-lock \\
                --taget-dir="${DB_BAK_PATH}"

        # DB apply logs
        /usr/bin/mariabackkup \\
                --prepare \\
                --target-dir="${DB_BAK_PATH}"

        # db server setting 압축
        /usr/bin/tar czpPf "${BAK_FILE}" "${BAK_LIST}"
        # db 백업 디렉토리 압축
        /usr/bin/tar czpPf "${DB_BAK_FILE}" "${DB_BAK_PATH}"

        # 백업파일 정보
        NAME="${/usr/bin/ls -al "${BAK_FILE}" | awk '{print $9}'}"
        SIZE="${/usr/bin/ls -al "${BAK_FILE}" | awk '{print $5}'}"
        /bin/echo "=== 백업 파일 정보 :"
        /bin/echo " | 파일명   : ${NAME}"
        /bin/echo " | 파일크기 : ${SIZE}Byte"
        /bin/echo

        # DB백업파일 정보
        NAME="${/usr/bin/ls -al "${DB_BAK_FILE}" | awk '{print $9}'}"
        SIZE="${/usr/bin/ls -al "${DB_BAK_FILE}" | awk '{print $5}'}"
        /bin/echo "=== DB백업 파일 정보 :"
        /bin/echo " | 파일명   : ${NAME}"
        /bin/echo " | 파일크기 : ${SIZE}Byte"
        /bin/echo

				# 백업 종료 시각
        /bin/echo
        /bin/echo "=== 백업종료 시각:"
        /bin/date
        /bin/echo
# 일일이 리다이렉션 아닌 한번에 {} 통해 리다이렉트 하기
}>| "${LOG}"
## ---로그기록 끝

## 스토리지 언마운트
/usr/bin/unmount /mnt

## 텔레그램으로 백업 로그를 전송
"${PUSh}" "${HOST}" "$(/usr/bin/cat "${LOG}")"

##로그파일삭제
/usr/bin/rm -f "${LOG}"

crontab을 통해 새벽 시간 하루에 한번 백업 파일을 스토리지 서버에 업로드 할 수 있게 자동화 설정 진행