실무에서 자주 사용되는 쉘 스크립트  #6
           (요일별 차등백업 프로그램)



  지난강좌(#5)는 서버의 트래픽을 측정해 보았다.
금번 강좌에서는 서버에서 가장 중요한 백얼을 효율적으로 할 수 있는 프로그램을 만들어 보겠다. 서버 장애/삭제등의 이유로 데이터를 잃게 된다면, 가장 힘이 되는 것은 백업이다.

다음과 같은 상황을 고려하여 프로그램을 만들어 갈 것이다.
  1. 매일 백업을 한다.
  2. 데이터는 일주일간 유지되어야 하다.
    ( 토요일에 데이터가 없어진것을 화요일에 발견해도 금요일 데이터로 복원가능해야 한다.)
  3. 데이터 양이 많아 변경(추가/삭제/수정)된 부분만 백업하려 한다.

위 조건을 만족하는 프로그램을 만들어보자~



1) 차등백업을 한다?
  차등이란 변경(추가/삭제/수정)된 파일 및 디렉토리만을 백업하는 것을 말한다.
그래도 비교 대상 데이터가 있어야 하기 때문에 최초 1회는 full 백업할 것이다.
처음 모든것을 가져오고 시간이 지난다음 그것과 비교하여 변경된 것을 가져온다. #$@#$@%
아주 복잡하다... 하지만 하나의 명령어면 우리의 고민을 해결해 줄 수 있다.


  (1) rsync명령어를 알자!
    rsync -av /home/  /backup/home/

  위 명령어를 내리면, /home/ 디렉토리의 모든 파일 및 디렉토리를 /backup/home/ 에 모두 복사해 준다. 권한, 소유자 등 모든 것을 똑같이 복사해 준다.

   한번더, 명령어를 내리면 추가된 파일이, 수정된 파일이 있으면 복사해 준다.
하지만, 원본에서 지우면 사본에서는 지워지지 않는다.


  (2) 원본에서 지워지면, 사본에서도 지워라!
    rsync -av --delete /home/  /backup/home/

  위 명령어를 내리면, 원본에서 지워졌다면 사본에서도 지워진다.
 --delete 옵션이 바로 그런 역할을 한다.


이렇게 하면, 우리가 고민하던 것을 말끔히 해결해 준다. 모든 파일을 동일하게^^



 
2) 어떻게 누적 백업 할까?
  누적 백업? 일주일간 누적? rsync명령어로는 원본과 사본을 유지 할 수 밖에 없다.
  어떤 방법이 좋을까? 여러가지 방법이 있겠지만, 가장 효율적인 방법이라 생각한 것이 요일별로 디렉토리를 만들어 차등백업 하는 것이다.

  (1) 요일별로 디렉토리를 만들자
     
     export LANG=en
     week="`date '+%A'`"

     mkdir -p /backup/$week

   일단, 언어를 영어로 한다. 디렉토리는 한글을 사용하지 않는 것이 좋다.
 위급한 상황에 리눅스콘솔에서 한글파일및 디렉토리명을 지원하지 않을 수 있기 때문이다.

   오늘은 무슨요일? date 에서 '%A'는 요일을 의미한다. Friday 이렇게 나온다^^
  그런다음, mkdir으로  디렉토리를 만들어 주면 끝^^


  (2) 요일별 차등백업
     위에서 만든 디렉토리에 rsync명령으로 백업하면..

     export LANG=en
     week="`date '+%A'`"

     mkdir -p /backup/$week
     rsync -av --delete /home/  /backup/$week/home/

   위 명령어를 내리면 백업이 될 것이다.!!


  (3) 앗! 디렉토리가 이미 있다면 에러가 난다~
     export LANG=en
     week="`date '+%A'`"

     if [ ! -d "/backup/$week/home/" ] ; then
        mkdir -p /backup/$week/home/
     fi
     rsync -av --delete /home/  /backup/$week/home/

     이렇게 하면 디렉토리가 없다면, 만들어서 백업해 줄것이다.



3) 여러개의 백업 디렉토리가 있다면?
  지금까지 예제에서는 /home/ 디렉토리를 대상으로 했다. 하지만 서버에는 수 많은 백업대상이 있다. 그럴 때 마다 위와같이 줄~줄 나열하는 것은 비효율적이다.
 이제! 함수라는 것을 배워보자~

  (1) 함수(function)
  모든 언어에는 함수가 존재한다. 일부 언어에는 프로시져와 함수를 달리 사용하기도 한다.
 하지만, bash쉘에서는 함수만 제공한다.
   함수는 어떤 일의 단위로 작성하기도 하고, 반복되는 루틴을 작성하여 효율적으로 사용하기도 한다.  함수에 대한 자세한 설명은 본 강좌에서 하지 않겠다.


  (2) 함수의 적용
   function sum {
     echo $(($1+$2))
   }

  sum 1 2


 위 예는 간단한 함수를 만들었다.  함수에 2개의 파라미터를 넣어서 더하게 하는 함수이다.
sum 1 2 이렇게 하면 결과는 3이 출력된다. bash에서 함수는 명령어의 형식과 같다.  함수명 뒤에 나오는 것이 파라미터 1번, 두번째 나오는 것이 파라미터 2번이다. 함수 내에서도 $1은 파라미터 1번, $2는 파라미터 2번이 된다. 다른 언어와 같이 파라미터 갯수를 미리 선언할 필요 없다. 명령어의 인자와 같이 넘겨서 처리 하기만 하면 된다.


  (3) 백업 프로그램에 함수 사용
 
    export LANG=en
    week="`date '+%A'`"
    backup_dir="/backup/$week"

    function sync_bak {
      from=$1
      to=$2
      if [ ! -d "$to" ] ; then mkdir -p $to ; fi
      rsync -av --delete $from $to
    }

    sync_bak /home/ $backup_dir/home/
    sync_bak /usr/local/mysql/data/ $backup_dir/mysql-data/


함수를 사용하여 우리 프로그램을 위와 같이 완성하였다.

sync_bak 함수를 만들었고, 그 파라미터는 백업대상과 백업할 곳을 넣었다.
그리고 백업 할 곳이 없으면, 만들게 했다.

위 프로그램에서는 /home/과 /usr/local/mysql/data/를 백업하고 있다.
물론 더 많다면 비슷한 형식으로 기술해 주면 된다.^^

  위 프로그램 작성후 cron에 등록해 하루에 한번씩 실행하면,
우리가 원하는 결론은 얻은 것이다.^^



위 쉘스크립트로  원하는 디렉토리를 원하는 장소에 백업 할 수 있을 것이다.
일주일간 누적보관하기 때문에 매우 좋다.^^ 단, 백업 디스크 용량이 큰것이 필요하겠다.~~~



우리는 이것으로
 가장힘이 되는 백업을 효율적으로 할 수 있는 프로그램을 만들었다. 위 스크립트를 작성하면서
date, rsync, mkdir 명령어  및  함수, 파라미터 $1, 변수, if
, export  문을 알게 되었다.
 잘 만들어진 백업 스크립트로 안전한 서버 운영을 하게 되었다. 작은행복^^

'OS > LINUX' 카테고리의 다른 글

Perl 입문  (0) 2011.05.17
프로세스 - fork & exec  (0) 2011.05.14
쉘스크립트 ex5  (0) 2011.05.14
쉘스크립트 Ex4  (0) 2011.05.14
쉘스크립트 Example2  (0) 2011.05.14

+ Recent posts