백업받기

by 조쉬 posted Sep 12, 2016
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄
cd /backup
tar cvpfz /backup/home.tar.gz /home --exclude=/home/test

일반적으로 tar 로 백업시 사용되는 확장자 규칙은 압축되지 않고 단순히 하나의 파일로 패킹(packing) 한 파일의 경우에는 "tar" 를, gzip 으로 압축된 파일의 경우에는 "tar.gz" 나 "tgz" 를 확장자로 한다. 따라서 확장자가 home.tar.gz나 home.tgz일 경우 tar로 packing 된 후 gzip으로 압축되었음을 뜻한다.

백업시 ``z'' (압축) 옵션의 사용에 유의하여야 한다. 단순히 하나의 파일로 압축 백업시에는 때에 따라 데이터의 일부가 손상되는 경우가 있는데, 이때에는 백업된 파일 전체가 깨어져 복구를 할 수 없게 되는 경우가 있다. 백업 시 압축을 하지 않고 단순히 tar 로 묶은 경우에는 설사 압축파일이 깨어졌다 하더라도 압축 파일의 복구가 가능하기 때문에 백업 시 압축을 할 것인지 여부를 신중히 선택하여야 한다.
아울러 현재까지 안정 KERNEL인 Kernel 2.2의 경우 하나의 파일은 최대 2G 가 최대 사이즈인데, 특정 파티션 이하에 많은 파일이 있어 하나의 파일로 백업할 경우 2G를 넘을 경우에는 적당히 분산하여 백업을 하여야 한다.
이때에는 아래와 같은 방법이 가능할 것이다.

tar cvfpz home_a_h.tar.gz /home/[a-h]*
tar cvfpz home_i_p.tar.gz /home/[i-p]*
tar cvfpz home_q_z.tar.gz /home/[q-z]*



>> 실제 백업 스크립트 예.

#!/bin/sh .................. (1)

cd /backup .................. (2)
rm -f *.tar.gz ................... (3)
tar cvfpz apache.tar.gz /usr/local/apache/* ........ (4)
tar cvfpz home.tar.gz /home/* --exclude=/home/test ........ (5)
tar cvfpz etc.tar.gz /etc/* ........... (6)
tar cvfpz mail.tar.gz /var/spool/mail/* ........... (7) ,
chown backup.backup *.tar.gz .............. (8)
chmod 700 *.tar.gz .............. (9)
ls -alh | mail -s "백업정보" backup@tt.co.kr ........ (10)
df --sync -h | mail -s "파티션정보" backup@tt.co.kr .......... (11)


(1) 시작되는 내용이 Shell Script 임을 정의한다.
(2) 백업작업이 이루어지는 파티션인 /backup 으로 이동한다.
(3) 기존의 백업된 파일을 모두 삭제한다.
(4) - (7) 번까지는 백업을 해야 할 디렉토리 이하에 대해 데이터를 각각 백업한다.
(8) 백업된 파일의 소유권을 backup 으로 설정한다.
(9) 백업된 파일의 권한을 700 으로 설정한다.
(10) 백업이 제대로 되었는지 확인하기 위해 현재의 디렉토리내 백업 파일의 리스트를 백업 담당자인 backup@tt.co.kr 에게 메일로 발송한다.
(11) 혹 파티션이 찰 수도 있으니 현재의 파티션 사용 정보를 백업담당자에게 메일로 발송 한다.



>> 증가분 백업하기.

#!/bin/sh ...........(1)

TODAY=`date +"%d %b %Y"` ........... (2)
PREVIOUSDAY=`cat FULL_BACKED_DAY` ............ (3)
tar cvfpzG _modified_home.tgz -N "$PREVIOUSDAY" /home ..........(4)

/home 에 대해 Full Backup을 실행하기로 한다.(이때 Full 백업 스크립트 제일 하단에
echo `date +"%d %b %Y"` > FULL_BACKED_DAY 를 추가한다)

이후 매일 위의 스크립트를 실행하면 풀백업 이후 추가 및 변경된 파일 및 디렉토리만 선별하여 별도로 백업을 하게 되는 것이다.
(1) 실행되는 스크립트가 Shell 스크립트임을 정의한다.
(2) 현재의 시각을 -N 옵션이 이해할 수 있는 13 Jan 2001 형태로 TODAY 라는 변수에
대입한다.
(3) 이전에 Full 백업시의 시각인 FULL_BACKED_DAY를 읽어 PREVIOUSDAY 라는 변수에 대입한다.
(4) /home 디렉토리 이하에 대해 Full 백업시의 시각 이후로 변경, 추가된 파일에 대해서만 modified_home.tgz 라는 파일로 저장한다.



# 참고

cron 이용하기.

cron 은 일종의 일정관리 데몬으로서 기본 설정파일인 crontab 에 따라 정해진 시각에 따라 주기적으로 명령을 수행한다. crontab 는 7개의 구성요소로 이루어지는데, 6번째 필드(User)는 생략되어도 무방하다.

분 / 시 / 날짜 / 달 / 요일 / 사용자 / 명령어

각 항목은 정수로 나타낼 수도 있고 또한 몇 개의 항목은 와일드카드 문자로 인식되는 ``*'' 문자로 표현이 가능한데, * 는 "매"의 의미이다. 즉 시간 항목에 * 이 있다면 매시간이라는 뜻이고 날짜 항목에 * 이 있으면 매일이라는 뜻이 되는 것이다. 그리고 하나의 필드에 중복된 시간을 나타내고자 하면 콤마로 구분하면 되고, 연속된 시간을 나타내고자 하면 하이픈(-)을 이용하여 일정기간을 나타낼 수 있다.
참고로 분은 0-59, 시는 0-23, 날짜는 0-31, 달은 0-12(0또는 12는 12월, 1은 1월...), 요일은 0-7(0과 7은 일요일, 1은 월요일)로 나타낸다.

/etc/crontab 파일예
01 * * * * root run-parts /etc/cron.hourly
02 2 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
0 0 * * 1 root rdate -s time.bora.net && clock -w

위 그림에서 각각의 의미를 알아보도록 하자.
첫줄은 매시 1분에 /etc/cron.hourly 디렉토리내의 스크립트를 실행한다는 의미이고,
두번째줄은 매일 02시 2분에 /etc/cron.daily 내의 스크립트를 실행한다는 의미이고,
세번째줄은 매월, 매일 새벽 4시 22분에 /etc/cron.weekly 디렉토리내 스크립트를 실행하는 것처럼 보이지만 5번째 필드인 <요일> 필드값이 0 이므로 1주일에 1회 일요일(0이므로) 에 /etc/cron.weekly 디렉토리내의 스크립트를 실행하라는 것이다.
다섯번째줄과 같이 매일,매주 0시0분, 매주 월요일(1) 에 rdate -s time.bora.net && clock -w 라는 명령어를 실행하라고 직접 명령어를 지정해 줄 수도 있다.
각 디렉토리 내 실행 스크립트는 정기적으로 시스템에 의해 실행이 되어야 하므로 실행(eXecute) 권한이 있어야 함은 당연하다. 따라서 위에서 작성한 스크립트를 700 정도의 적당한 실행권한을 부여하여 해당 디렉토리에 설정해 주면 될 것이다.
또는 직접 /etc/crontab를 편집하여 실행시간을 정의할 수도 있다.

DB 등 중요 데이터 매일 백업하기.
--> /etc/cron.daily/db_bak.sh
#!/bin/sh
dat=`date +%Y%m%d%H%M`
tar cvfpz /backup/db/mysql_$dat.tgz /usr/local/mysql/var/*
chmod 700 /backup/db/*

--> /etc/cron.3days/db_del.sh
#!/bin/sh
find /backup/db/ -mtime +3 -exec rm -f {} \;

/backup/db 에는 3일치 데이터가 늘 저장됨.