웹서버 및 mysql DB 백업 쉘스크립트 [3]

웹서버 및 mysql DB 백업 쉘스크립트 [3]

 

백업이란?

웹,데이터베이스 서버에 문제가 발생했을 때 복구를 할 수 있도록 백업을 준비해야한다.

 

 

✅tar : 압축하거나 압축을 푸는 툴

 

✅mariabackup : 툴. 마리아 db 백업하기 위한 툴.

백업할때 테이블 락을 걸면 안된다.

 

 

✅온라인 백업(서비스를 운영하면서 백업) 실행 방법

 

백업중 인서트, 업데이트, 딜리트 된 데이터는 ib_logfile0 에 저장이 된다.

이 파일을 위의 백업된 파일에 넣는 작업.

 

✅DB 복구 하기

 

✅백업 정책 세우기

 

✅백업 스크립트가 해야할일 정리

 

✅스크립트 작성 순서

  • Web 서버
  • Db 서버

 

📌[3-1] 웹서버 설정파일 및 웹서버 파일 백업 쉘스크립트

(참고로 storage 에 mount 하는 폴더 mmt 가 아니라 mnt 임 다음 포스팅에서 수정)

#! /bin/bash


## 변수 설정


HOST="$(/bin/hostname)"


LOG="/tmp/backup.log"

#푸시 기능이 있는 쉘스크립트 경로
PUSH="/root/monitor/telegram_push.sh"

#시스템 날짜
DATE="$(/bin/date +%Y.%m.%d)"

#백업할 디렉토리 / 파일을 지정
BAK_LIST="/etc/nginx /usr/share/nginx/html"


#백업 디렉토리
BAK_PATH="/mnt/BACKUP/${HOST}"

#백업 파일명
BAK_FILE="${BAK_PATH}/${DATE}_${HOST}_WEB_SERVER.tgz"


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


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


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



## --- 로그 기록 시작
{

	#백업시작시각
	/bin/echo
	/bin/echo "=== 백업시작 시각 : "
	/bin/date
	/bin/echo	


	#백업
	#p:퍼미션 유지 , P:절대경로유지
	/bin/tar czpPf "${BAK_FILE}" ${BAK_LIST}		


	# 백업파일 정보
	NAME="$(/bin/ls -al "${BAK_FILE}" | awk '{print $9}')"
	SIZE="$(/bin/ls -al "${BAK_FILE}" | awk '{print $5}')"
	/bin/echo "=== 백업 파일 정보 : "
	/bin/echo " | 파일명 : ${NAME}"
	/bin/echo " | 파일크기 : ${SIZE} byte"	
	
	#백업종료시각
	/bin/echo
	/bin/echo "=== 백업 종료 시각 : "
	/bin/date
	/bin/echo
}>|"${LOG}"

## ---  로그 기록 끝



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


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

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

 

✅참고 : 폅집중 :! 명령어 사용해서 명령어 실행가능

-mkdir -p : 부모 디렉토리가 없으면 부모 디렉토리까지 만들어 주는 명령어

 

✅crontab 에 등록

crontab -e

 

# 웹서버 백업 - 매일 새벽 4시에 작동되게 처리

00 04 * * * /root/monitor/web_server_backup.sh >/dev/null 2>&1

 

✅crontab 등록한 스케쥴 확인

crontab -l

 

 

📌[3-2] 데이터 베이스 백업 스크립트

 

✅Mysql 설치 확인

mysql -V

 

✅mysqldump 설치 확인

mysqldump -V

 

✅우분투에서 mysql db 설정파일 위치

 

Ubuntu에서는 my.cnf 파일이 /etc/mysql 밑에 위치합니다.

(아래 파일은 conf.d, 와 mysql.conf.d 를 include 합니다.)

/etc/mysql/my.cnf

 

✅root@545ddaf경로 : /etc/mysql# cat my.cnf

#

# The MySQL database server configuration file.

 

!includedir /etc/mysql/conf.d/

!includedir /etc/mysql/mysql.conf.d/

 

## 백업과 복원 모두 지정 경로로 이동 후 명령 실행 (참고 : https://wondongho.tistory.com/204 )

 

1. DB백업

sudo mysqldump -uroot -p DB명 > 저장할파일이름.sql

 

2. DB복원

sudo mysql -uroot -p DB이름 < 파일이름.sql

 

 

📌db_backup.sh 내용

(참고로 storage 에 mount 하는 폴더 mmt 가 아니라 mnt 임 다음 포스팅에서 수정)

#! /bin/bash


## 변수 설정


HOST="$(/bin/hostname)"


LOG="/tmp/db_backup.log"

#푸시 기능이 있는 쉘스크립트 경로
PUSH="/root/monitor/telegram_push.sh"

#시스템 날짜
DATE="$(/bin/date +%Y.%m.%d)"

#백업할 MYSQL 설정파일이 있는 디렉토리 경로
BAK_LIST="/etc/mysql/my.cnf"


#백업 디렉토리
BAK_PATH="/mnt/BACKUP/${HOST}"

#DB 설정 파일의 백업 파일명
BAK_FILE="${BAK_PATH}/${DATE}_${HOST}_DB_CONF.tgz"


# DB 백업 파일명SQL
DB_BAK_FILE_SQL="${BAK_PATH}/${DATE}_${HOST}_DB.sql"
DB_BAK_FILE_TGZ="${BAK_PATH}/${DATE}_${HOST}_DB.tgz" 


#DB 정보
DB_USER=""
DB_PW=""
DB_NAME=""



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


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


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


## --- 로그 기록 시작
{

	#백업시작시각
	/bin/echo
	/bin/echo "=== DB 설정파일 백업 + DB  백업시작 시각 : "
	/bin/date
	/bin/echo	


	
	#mysqldump를 이용해서 저장 위치에 저장후 압축한다.
	/usr/bin/mysqldump -u${DB_USER} -p${DB_PW} ${DB_NAME} > ${DB_BAK_FILE_SQL}	
	/bin/tar czpPf ${DB_BAK_FILE_TGZ} ${DB_BAK_FILE_SQL}
	

	#DB 설정파일 백업
	#p:퍼미션 유지 , P:절대경로유지
	/bin/tar czpPf "${BAK_FILE}" ${BAK_LIST}		


	#[1] DB설정 백업파일 정보
	NAME="$(/bin/ls -al "${BAK_FILE}" | awk '{print $9}')"
	SIZE="$(/bin/ls -al "${BAK_FILE}" | awk '{print $5}')"
	/bin/echo "===[1] DB 설정파일의 백업파일 정보 : "
	/bin/echo " | 파일명 : ${NAME}"
	/bin/echo " | 파일크기 : ${SIZE} byte"	
	

	#[2] DB 백업파일 정보
	NAME="$(/bin/ls -al "${DB_BAK_FILE_TGZ}" | awk '{print $9}')"
	SIZE="$(/bin/ls -al "${DB_BAK_FILE_TGZ}" | awk '{print $5}')"
        
	/bin/echo "===[2] DB 백업파일 정보 : "
        /bin/echo " | 파일명 : ${NAME}"
        /bin/echo " | 파일크기 : ${SIZE} byte"  
	

	#백업종료시각
	/bin/echo
	/bin/echo "=== 백업 종료 시각 : "
	/bin/date
	/bin/echo
}>|"${LOG}"

## ---  로그 기록 끝



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


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

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

 

✅crontab 등록

 

# 파티션 용량 감시 모니터링(매일 정각)

00 * * * * /root/monitor/log_part.sh >/dev/null 2>&1

 

# 로그 파일 용량 감시 모니터링(매일 정각 30분)

30 * * * * /root/monitor/log_mon.sh >/dev/null 2>&1

 

# nginx 설정파일및 웹서버파일 백업 (매일 새벽 4시)

00 04 * * * /root/monitor/web_server_backup.sh >/dev/null 2>&1

 

# DB 설정파일 및 DB 백업(매일 새벽 3시)

00 03 * * * /root/monitor/db_backup.sh >/dev/null 2>&1