진행OS
KT Cloud 사용
준비물
1. 서버 1대
2. MySQL 설치 환경
ㄴ테스트를 위해 하나 이상의 Database가 필요합니다.
(포스팅에서는 DB Dump 백업을 예시로 진행하였습니다. / DB Dump 백업이 아니라면, DB가 굳이 없어도 됩니다.)
3. HTTPD(Apache) 설치 환경
ㄴ포스팅에서는 웹소스 백업을 예시로 진행하였습니다. / 웹소스 백업이 아니라면, Apache가 굳이 없어도 됩니다.
📌 Shell 이란?
- 쉘은 운영체제 상에서 사용자가 입력하는 명령어를 읽고 해석하여 대신 실행해 주는 프로그램이다.
- 운영체제의 커널과 사용자 사이를 이어주는 역할을 한다.
- Linux에서 사용하는 쉘(Shell)의 종류
종류 | 풀명칭 | 프롬프트 | 경로 |
bash | Bourne-Again Shell | # | /bin/bash |
sh | Bourne Shell | $ | /bin/sh |
csh | C Shell | % | /bin/csh |
ksh | Kron Shell | $ | /bin/ksh |
tcsh | TENEX C Shell | > | /bin/tcsh |
📌 Shell Script란?
- 쉘에서 사용할 수 있는 명령어들의 조합을 모아서 만든 배치(batch) 파일
- 운영체제의 Shell을 이용하여 한줄씩 순차적으로 읽으면서 명령어들을 실행 시켜주는 인터프리터 방식의 프로그램
📌 Crontab이란?
- 스케줄링을 관리하는 프로그램
- 사용자가 작성한 스크립트나 명령을 일정 주기나 시간마다 실행할 수 있도록 해주는 역할
- 백업 시스템이나 데이터베이스 관리, 기타 반복적인 업무를 간편하게 등록할 수 있다.
- 사용 예시 ( 매주 일요일(0) 매시간 30분마다 test.sh를 실행 )
분(0-59) | 시(0-23) | 일(1-31) | 월(1-12) | 요일(0-6) | 사용자 | 실행 명령어 |
30 | * | * | * | 0 | root | /home/test/test.sh |
📌 Shell Script 를 이용한 백업
1. 필요한 디렉토리 및 파일 생성
# 디렉토리와 파일 이름은 자유롭게 설정한다.
# 테스트를 진행할 디렉토리 생성
# mkdir /[지정할경로]/[만들디렉토리]
mkdir /home/backup
# backup 디렉토리 안에서 mysql과 web 소스를 저장하는
# 디렉토리를 추가로 생성한다.
mkdir /home/backup/sqlBackup
mkdir /home/backup/webBackup
# /backup 디렉토리 안에 .sh 파일과
# 테스트를 위해 필요한 .html 파일을 만든다.
# 빈 파일을 만들기 위해 touch로 진행했지만, 바로 내용을 채우려면
# vi 편집기를 이용해도 좋다.
touch backupTest.sh
touch index.html
2. index.html 파일 내용을 아무렇게나 입력
# vi 편집기로 파일을 수정한다.
# vi [경로]/index.html
vi /home/backup/index.html
# ---- vi 편집
Test Backup
# 저장 후 종료
:wq
3. backupTest.sh 파일 수정
# 아래 내용처럼 추가한다.
#!/bin/sh
date=`date +"%Y-%m-%d %H시%M분%S초"`
# 파일 이름으로 사용될 날짜
backup_date=`date +"%Y%m%d%H"`
# 백업한 파일을 담을 디렉토리 경로
sql_backup_dir="/home/backup/sqlBackup"
html_backup_dir="/home/backup/webBackup"
# 백업할 Web 소스의 위치
backup_file=/home/backup/index.html
# Web 소스를 백업할 파일의 이름은 test_[날짜].tar.gz로 설정
# 길이가 길어서 변수에 미리 지정
backup_html_name=${html_backup_dir}/test_${backup_date}.tar.gz
# tar 파일로 만들기
# tar 파일의 이름은 backup_html_name 변수에 있는 이름으로 하며
# 백업될 파일은 backup_file에 설정된 것으로 지정
tar zcvf ${backup_html_name} ${backup_file}
# mysql
# mysqldump -u[유저이름] -p[비밀번호] [DB이름] > [백업경로]/[파일이름].sql
mysqldump -uroot -pth0611@! testdb > ${sql_backup_dir}/test_${backup_date}.sql
# echo의 경우 crontab으로 실행할 때 뜨지 않음.
# 테스트를 위해서 직접 명령어로 실행해보거나
# sh 파일이 있는 곳에서 ./test.sh 로 실행 가능
# echo 를 이용해 html에 아래 내용을 넣는 형식으로 해볼 수도 있을 것이다.
echo "백업 되었습니다. / 현재 시각: ${date}"
exit 0
4. crontab 설정
# 수정 위치
vi /etc/crontab
# 파일 맨 아래 부분에 아래 내용을 추가
# 분 시 일 월 요일 유저이름 경로(실행할 것)
# * * * * * root [경로]/[파일이름].sh
# 위 설정대로 한다면 1분마다 실행
# 아래는 매시간 0분에 실행
# 쉽게 말하면 1시간 간격
0 * * * * root /home/backup/test.sh
5. 권한 설정 및 crond 재실행
# 권한설정
chmod -R 755 /[경로]/[파일명].sh
# crond 재실행
systemctl restart crond
6. 로그 확인
# 로그 경로
cat /var/log/cron
# grep을 이용하여 디렉토리 이름으로 로그를 찾으면
# 더 쉽게 찾아볼 수 있습니다.
cat /var/log/cron | grep backup
7. 실제로 시간이 지나고 제대로 적용이 되었는지 확인했다.
- 매 시간 00분에 shell script에서 지정했던 이름 [test_년월일시.확장자] 로 잘 나온다.