웹서버 및 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
'리눅스&서버 > 우분투' 카테고리의 다른 글
우분투 MQTT 서버구축과 기본 개념 (1) | 2022.09.14 |
---|---|
웹,데이터베이스 서버 트러블슈팅을 위한 쉘 스크립트 [4] (0) | 2022.05.07 |
디스크 파티션 사용량 모니터링 스크립트[2] (0) | 2022.03.23 |
서버 운영 필요한 지식 - 트러블 슈팅[1] - (텔레그램 봇 메시지 보내기) (0) | 2022.03.23 |
ubuntu 에 pm2 와 ssl 인증서로 https 설정 (0) | 2021.10.20 |