서버운영시 가장 중요하게 생각해야 될 것 중에 하나가 바로 백업 입니다. 백업이란 만일의 사태에 대비하여 중요 데이터를 복사해두는 것을 말하죠.. 이때 만일의 사태는 데이터가 손상되는 사고를 의미합니다.


만약 천재지변, 정전, 전쟁, 사이버테러등의 이유로 데이터가 손상된다면 서버운영을 더 이상할 수 없을 지도 모릅니다. 그래서 백업이란게 필요합니다. 데이터를 복사해두었다가 사고가 난다면 바로 복원시켜 운영에 지장이 없도록 하는 것이 백업의 목적입니다.


또한 백업은 일종의 보험과도 같습니다. 만일의 데이터 사고에 대비하는 보험이지요.. 그래서 우린 백업을 게을리해서는 안됩니다. 중요한 보험이니, 신경 써야겠죠?


그리고 백업 뒤 백업파일은 서버 외부에 두는 것이 안전합니다. 그렇게하면 서버자체가 물리적으로 망가지더라도 다시 복원할 수 있습니다. 


1. 백업 스크립트

아래의 쉘스크립트는 home 디렉토리와 전체 DB(mysql)를 백업후 원격 백업서버로 업로드(전송)하도록 짜여져있습니다.


backup.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# 백업 스크립트 By CONORY var 0.1
 
# 백업설정
TODAY=`date +%Y%m%d`
DELETE_DATE=`date -d "-백업보관기간(단위:일) days" +%Y%m%d`
BACKUP_DIR=/var/backup
LOG_DIR=/var/log/backup
 
#필요한 디렉토리 생성
if [ ! -d ${BACKUP_DIR} ]
then
    mkdir ${BACKUP_DIR}
    chmod 700 ${BACKUP_DIR}
fi
if [ ! -d ${LOG_DIR} ]
then
    mkdir ${LOG_DIR}
fi
 
# 홈 디렉토리 백업
TGZ_DIR="/home"
TGZ_FILE="backup.tar.gz"
tar cfz ${BACKUP_DIR}/${TODAY}_${TGZ_FILE} ${TGZ_DIR}
 
# DB Root 계정정보
DB_USER="root"
DB_PW="비밀번호(BD Root 계정)"
 
#전체 DB 백업
SQL_FILE="DBbackup.sql"
mysqldump -u ${DB_USER} -p${DB_PW} --all-databases > ${BACKUP_DIR}/${TODAY}_${SQL_FILE}
 
# 백업서버 FTP 계정정보
FTP_HOST="백업본을 전송할 원격서버 주소(ip나 도메인)"
FTP_USER="FTP 계정아이디"
FTP_PW="FTP 계정비밀번호"
 
# 원격 백업서버로 백업파일 업로드 (업로드에 실패하면 재시도)
LOG_FILE=${LOG_DIR}/${TODAY}.log
while [ ! -e $LOG_FILE ] || [ `egrep -c "226 Transfer complete" ${LOG_FILE}` -lt 2 ]
do
    {
    echo user $FTP_USER $FTP_PW
    echo bi
    echo prompt
    echo lcd ${BACKUP_DIR}
    echo mdelete ${DELETE_DATE}_${TGZ_FILE} ${DELETE_DATE}_${SQL_FILE}
    echo mput ${TODAY}_${TGZ_FILE} ${TODAY}_${SQL_FILE}
    echo bye
    } | ftp -n -v $FTP_HOST > $LOG_FILE
done
 
# 로컬 백업파일 삭제
rm -f ${BACKUP_DIR}/${TODAY}_${TGZ_FILE} ${BACKUP_DIR}/${TODAY}_${SQL_FILE}
  1. 위 스크립트를 복사해 한글로된 설정을 자신의 환경에 맞게 수정합니다. 
  2. backup.sh 스크립트 파일의 퍼미션을 "700"으로 조정합니다. (chmod 700 backup.sh)


* 원격서버 백업 로그파일은 /var/log/backup 에 날짜별로 기록됩니다.

* 혹시 백업파일 업로드(전송)가 (서버접속불가, 용량부족등의 이유로..)실패한다면 될때까지 계속 재시도됩니다. (계속 실패한다면 무한 루프가 발생할 수 있으니, 원격서버를 점검해주세요.)

* 백업파일을 ftp로 전송한 다음 로컬에 있는 백업본은 삭제됩니다. (용량문제로..) 혹시 삭제하고 싶지않다면 스크립트 마지막줄을 삭제하세요.



2. 매일마다 백업 실행

백업하고 싶다면 위에서 만든 backup.sh 파일을 실행하면 됩니다. 하지만 매일 같은 시간에 백업을 실행하는 것은 좀 귀찮지요. 그래서 cron으로 정해진 시간에 매번 백업되도록 만듭니다.


# crontab -e


crontab vi 에디터에서 아래 스케줄(매일 오전 3시에 백업)을 입력하고, 저장합니다.

0 3 * * * /home/system/backup.sh


이로써 매일마다 자동으로 백업하게 되었습니다.