본문 바로가기
프로그래밍/리눅스

[리눅스] 요일별 백업

by 소나기_레드 2023. 2. 28.

서버에서 가장 중요한 백얼을 효율적으로 할 수 있는 프로그램을 만들어 보겠다. 서버 장애/삭제등의 이유로 데이터를 잃게 된다면, 가장 힘이 되는 것은 백업이다.

다음과 같은 상황을 고려하여 프로그램을 만들어 갈 것이다.
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에 등록해 하루에 한번씩 실행하면,
우리가 원하는 결론은 얻은 것이다.^^

[출처] http://blog.naver.com/e839638/140059390449

 

'프로그래밍 > 리눅스' 카테고리의 다른 글

[리눅스] 시간 동기화  (0) 2023.02.28
[리눅스] FTP 설정 및 사용  (0) 2023.02.28
[리눅스] VI 편집기 사용법  (0) 2023.02.28
[리눅스] 기본 명령어  (0) 2023.02.28
[리눅스] 개발환경의 개요도  (0) 2023.02.28

댓글