Profile picture

web,db,nfs 백업 스크립트 작성 - 주기적으로 서버 자원 백업하기

JaehyoJJAng2023년 02월 25일

◾️ 시나리오

웹, 데이터베이스 서버에 문제가 발생했을 때 바로 복구할 수 있도록 백업 체계 갖추기.


▪️ 자주 사용될 명령어

• tar

# 압축 시
tar -cvzf 압축할파일명 압축할디렉토리/파일 -

# 압축 해제 시
tar -xvzf 압축풀파일명

◾️ 백업 정책 세우기

정책 내용 방법
무엇을 웹 : 웹소스 , 서버주요설정
DB: 데이터,서버 주요섫정
스토리지 : 서버 주요 설정
tar 볼로 묶어서 보관
언제 하루 한번, 유저 트래픽이 가장 적은 시간대 새벽 3시 ~ 5시
어디에 각 서버 이름(hostname) 디렉토리 /mnt/backup/서버호스트이름

▪️ 해야할 일 정리

  • 백업 스크립트가 수행해야 할 job 목록

  • 스토리지에 마운트 (mount)
  • 지정한 파일/디렉토리를 tar볼로 묶어서 저장 (tar)
    • 데이터베이스 서버의 경우 데이터 덤프 후 tar볼로 묶어서 저장(mariabackup)
  • 백업 레포팅파일 생성 (echo, redirect)
    • 백업 시작/종료 시각 (date)
    • 백업 파일 정보 (ls)
  • 레포팅 파일을 읽어 관리자 텔레그램으로 전송 (/root/monitor/tel_push.sh)

◾️ 스크립트 작성

▪️ 백업 스크립트 (web)

# /home/${USER}/backup-script/web/script.sh

#!/usr/bin/bash

#### 필요한 변수 선언
HOST="${HOSTNAME}"
LOG_FILE_NM="/tmp/backup.log"
TEL_FILE="/home/${HOST}/telegram/alarm.sh"
DATE="$(date +%Y.%m.%d)"
#

#### 백업할 디렉토리/파일 지정
TARGET_BAK_LIST="/home/${HOST}/wordpress/html"
#

#### 백업 디렉토리 경로 지정
BAK_PATH="/mnt/${HOST}/${HOST}-backup"
#

#### 백업 파일 이름 지정
BAK_FILE_NM="${BAK_PATH}/${DATE}_${HOST}.tgz"
#

#### 로그 파일 생성
touch "${LOG_FILE_NM}"
#

#### BAK_PATH가 없는 경우 새로 생성
if [[ ! -e "${BAK_PATH}" ]]; then
    echo "백업 디렉토리 생성"
    mkdir -p "${BAK_PATH}"
fi
#

#### 로그 기록 시작
{
    echo -e "백업 시작 "
    echo -e "($(date "+%Y.%m.%d %H:%M"))\n"

    tar -czpPf "${BAK_FILE_NM}" "${TARGET_BAK_LIST}"
    NAME=$(ls -lh "${BAK_FILE_NM}" | awk '{print $9}')
    SIZE=$(ls -lh "${BAK_FILE_NM}" | awk '{print $5}')

    echo -e "=== 백업 파일 정보 (${HOST}) ===\n"
    echo "파일명 : ${NAME}"
    echo "파일크기 : ${SIZE}"
    echo

    echo -e "\n백업 종료 "
    echo -e "($(date "+%Y.%m.%d %H:%M)")\n"

} > "${LOG_FILE_NM}"
#

#### 텔레그램으로 알림 전송
"${TEL_FILE}" "${HOST}" "$(cat "${LOG_FILE_NM}")"
#

#### 로그 파일 삭제
rm -rf "${LOG_FILE_NM}"
#

▪️ 백업 스크립트 (nfs)

# /home/${USER}/backup-script/nfs/script.sh

#!/usr/bin/bash

#### 필요한 변수 선언
HOST="${HOSTNAME}"
LOG_FILE_NM="/tmp/backup.log"
TEL_FILE="/home/${HOST}/telegram/alarm.sh"
DATE="$(date +%Y.%m.%d)"
#

#### 백업할 디렉토리/파일 지정
TARGET_BAK_LIST="/etc/exports /etc/nfs.conf /etc/nfsmount.conf /etc/fstab"
#

#### 백업 디렉토리 경로 지정
BAK_PATH="/mnt/md1/${HOST}-backup"
#

#### 백업 파일 이름 지정
BAK_FILE_NM="${BAK_PATH}/${DATE}_${HOST}.tgz"
#

#### 로그 파일 생성
touch "${LOG_FILE_NM}"
#

#### BAK_PATH가 없는 경우 새로 생성
if [[ ! -e "${BAK_PATH}" ]]; then
    echo "백업 디렉토리 생성"
    sudo mkdir -p "${BAK_PATH}"
fi
#

#### 로그 기록 시작
{
    echo -e "백업 시작 "
    echo -e "($(date "+%Y.%m.%d %H:%M"))\n"

    sudo tar -czpPf "${BAK_FILE_NM}" ${TARGET_BAK_LIST}
    NAME=$(ls -lh "${BAK_FILE_NM}" | awk '{print $9}')
    SIZE=$(ls -lh "${BAK_FILE_NM}" | awk '{print $5}')

    echo -e "=== 백업 파일 정보 (${HOST}) ===\n"
    echo "파일명 : ${NAME}"
    echo "파일크기 : ${SIZE}"
    echo

    echo -e "\n백업 종료 "
    echo -e "($(date "+%Y.%m.%d %H:%M)")\n"

} > "${LOG_FILE_NM}"
#

#### 텔레그램으로 알림 전송
"${TEL_FILE}" "${HOST}" "$(cat "${LOG_FILE_NM}")"
#

#### 로그 파일 삭제
sudo rm -rf "${LOG_FILE_NM}"
#

▪️ 백업 스크립트 (db)

# /home/${USER}/backup-script/db/script.sh
#!/usr/bin/bash

#### 필요한 변수 선언
HOST="${HOSTNAME}"
LOG_FILE_NM="/tmp/backup.log"
TEL_FILE="/home/${HOST}/telegram/alarm.sh"
DATE="$(date +%Y.%m.%d)"
#

#### 백업할 디렉토리/파일 지정
TARGET_BAK_LIST="/home/${HOST}/database/db-data"
#

#### 백업 디렉토리 경로 지정
BAK_PATH="/mnt/${HOST}/${HOST}-backup"
#

#### 백업 파일 이름 지정
BAK_FILE_NM="${BAK_PATH}/${DATE}.db.tgz"
#

#### 로그 파일 생성
touch "${LOG_FILE_NM}"
#

#### BAK_PATH가 없는 경우 새로 생성
if [[ ! -e "${BAK_PATH}" ]]; then
    echo "백업 디렉토리 생성"
    sudo mkdir -p "${BAK_PATH}"
fi
sudo chmod +w "/mnt/${HOST}/${HOST}-backup"
#

#### 로그 기록 시작
{
    echo -e "백업 시작 "
    echo -e "($(date "+%Y.%m.%d %H:%M"))\n"

    sudo tar -czpPf "${BAK_FILE_NM}" ${TARGET_BAK_LIST}
    NAME=$(ls -lh "${BAK_FILE_NM}" | awk '{print $9}')
    SIZE=$(ls -lh "${BAK_FILE_NM}" | awk '{print $5}')

    echo -e "=== 백업 파일 정보 (${HOST}) ===\n"
    echo "파일명 : ${NAME}"
    echo "파일크기 : ${SIZE}"
    echo

    echo -e "\n백업 종료 "
    echo -e "($(date "+%Y.%m.%d %H:%M)")\n"

} > "${LOG_FILE_NM}"
#

#### 텔레그램으로 알림 전송
"${TEL_FILE}" "${HOST}" "$(cat "${LOG_FILE_NM}")"
#

#### 로그 파일 삭제
sudo rm -rf "${LOG_FILE_NM}"
#

▪️ 텔레그램 봇 연동

# telegram/alarm.sh

#!/usr/bin/bash

# 파라미터 확인하기
if [[ ${#} -ne 2 ]]; then
    clear
    echo -e "Usage\n${0} hostname message"
    exit 1
fi

# 텔레그램 봇 관련 정보
TELE_INFO_FILE="/home/${USER}/telegram/.telegram.info"
TELE_INFOS=( $(awk -F '=' '{print $2}' "${TELE_INFO_FILE}" ) )
CHAT_ID="${TELE_INFOS[0]}"
API_TOKEN="${TELE_INFOS[1]}"
URL="https://api.telegram.org/bot${API_TOKEN}/sendMessage"

# 날짜
DATE="$(date +'%Y-%m-%d %H:%M')"

# 보낼 메시지 작성
TEXT="[${1}] ${2}"

# 메시지 보내기
curl -s -d "chat_id=${CHAT_ID}&text=${TEXT}" ${URL} > /dev/null
# /home/${USER}/telegram/telegram.info

CHAT_ID=1002XXXXX
TOKEN=66XXXX:XXXXXX

◾️ cron 스케줄러 등록

# DB서버 백업
00 04 * * * /root/backup/db_backup.sh >/dev/null 2>&1

Loading script...