실무에서 자주 사용되는 쉘 스크립트 #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 문을 알게 되었다.
잘 만들어진 백업 스크립트로 안전한 서버 운영을 하게 되었다. 작은행복^^
(요일별 차등백업 프로그램)
지난강좌(#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 문을 알게 되었다.
잘 만들어진 백업 스크립트로 안전한 서버 운영을 하게 되었다. 작은행복^^
[출처] 실무에서 자주 사용되는 쉘 스크립트 #6|작성자 루루보이
'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 |