본문 바로가기
Tip & Tech/Linux

백업 Shell script

by 변기환 2012. 6. 22.


서버운영 시 백업은 정말 중요하다. 최소 일주일치는 어디에든 백업이 되어 있어야 한다. 백업하지 않고 배짱부리다가는 언젠가는 땅을 치고 후회한다.


나는 셀 스크립트를 이용해 필요한 자료를 매일 새벽 서버의 특정 디렉토리에 압축해서 저장한 다음 오전 9시 내 컴퓨터로 내려받는다.


보통 며칠 분량을 서버에 저장해 두지만, 나는 당일 내 컴퓨터로 내려받은 후 다음 백업에 지워 버리도록 했다.


그리고 MySQL은 mysqldump를 이용해서 백업 하지 않고, 데이터 디렉토리 전체를 백업하도록 했다.


서버의 백업 파일을 내 컴퓨터로 내려받을 때에는 "Cobian Backup" 프로그램을 이용한다. "Cobian Backup" 사용법은 이전에 포스팅 한 적이 있으므로 참고하기 바란다.


FTP까지도 백업하는 - Cobian Backup


먼저 최상위 디렉토리에 "back_up" 디렉토리를 생성하고 사용자를 등록한 다음 passwd 파일에 사용자의 홈 디렉토리를 "back_up"으로 지정한다. 백업 전용 계정이므로 보안상 SSH 접속은 막는다. 그리고 다른 디렉토리로 이동을 하지 못하도록 운영하고 있는 FTP에 맞게 설정한다.


그리고 /root 디렉토리 아래에 crond 디렉토리를 만들고 아래의 스크립터로 back_up.sh을 생성한다. root만 실행하도록 권한은 700으로 지정한다.

#!/bin/bash
export Today="`date '+%y-%m-%d'`"
backup_dir="/back_up/BackUP"

################ 이전 백업 디렉토리 삭제
LDATE=$(date -d yesterday +%y-%m-%d)
rm -rf ${backup_dir}/$LDATE

################ 오늘 날짜로 백업 디렉토리 생성
/bin/mkdir -p ${backup_dir}/$Today
cd ${backup_dir}/$Today

################ /home 디렉토리를 계정별로 압축
dirlists=`/bin/ls -t /home 2>/dev/null`
for dir in $dirlists ; do
    tar cvfpz ${backup_dir}/$Today/$dir.tar.gz /home/$dir
done

################ etc 디렉토리를 압축
tar cvfpz ${backup_dir}/$Today/etc.tar.gz /etc

################ named 디렉토리 압축
tar cvfpz ${backup_dir}/$Today/var.named.tar.gz /var/named

################ MySQL 데이터 압축
tar cvfpz ${backup_dir}/$Today/mysql.tar.gz /var/lib/mysql


매일 새벽 4시 10분에 'ROOT'가 실행하도록 crontab에 등록

10 04 * * * root /root/crond/back_up.sh > /dev/null 2>&1


하루 치만 백업하다보니 간혹 내가 컴퓨터를 켜지 않아 백업이 누락되는 현상이 있다. 5일 치 정도는 서버에 저장하여 내 컴퓨터로 백업을 받지 못했을때 수동으로 백업 받을 수 있도록 궁리를 해봐야겠다.


추가 - 서버에 5일 치 백업 본을 저장


내 컴퓨터가 켜 지지 않아 백업을 받을 수 없는  경우를 대비해서 5일 치 백업을 서버에 저장해 두고 필요에 따라 수동으로 백업 받도록 설정함.


5일 이상 컴퓨터를 켜지 않는 경우는 없으니, 5일 치만 저장해도 충분할 듯.

#!/bin/bash
export Today="`date '+%y-%m-%d'`"
backup_dir="/back_up/BackUP"


################ 5일 치 백업 파일을 저장할 디렉토리

old_backup="/back_up/Old_BackUP"


################ 어제 날짜를 구하고

LDATE=$(date -d yesterday +%y-%m-%d)


################ 저장한지 5일이 지난 백업은 찾아서 삭제

find ${old_backup} -ctime +5 -exec rm -rf {} ;


################ 어제 백업은 보관할 디렉토리로 이동
mv ${backup_dir}/$LDATE ${old_backup}

################ 오늘 날짜로 백업 디렉토리 생성
/bin/mkdir -p ${backup_dir}/$Today
cd ${backup_dir}/$Today

################ /home 디렉토리를 계정별로 압축
dirlists=`/bin/ls -t /home 2>/dev/null`
for dir in $dirlists ; do
    tar cvfpz ${backup_dir}/$Today/$dir.tar.gz /home/$dir
done

################ etc 디렉토리를 압축
tar cvfpz ${backup_dir}/$Today/etc.tar.gz /etc

################ named 디렉토리 압축
tar cvfpz ${backup_dir}/$Today/var.named.tar.gz /var/named

################ MySQL 데이터 압축
tar cvfpz ${backup_dir}/$Today/mysql.tar.gz /var/lib/mysql


댓글