Ubuntu 백업 스크립트 작성하기

HYEONG HWAN, MUN/ 6월 14, 2015/ 미분류/ 17 comments

아래 설명글은 Ubuntu 뿐만 아니라 모든 Linux 배포판에 대해서 공통적으로 실행가능합니다.

서버를 운영하면서, 백업과 보안항상 염두해 두어야 하는 사항이다.

 

리눅스 시스템에서 주기적으로 파일과 데이터베이스 백업을 하는 방법에 대하여 설명하겠다.

 

1. 정책 세우기

언제마다 백업을 할 것인가? 백업 방식은 어떤것인가? 백업 유지 기간은? 백업 저장소는 어떤 것인가?

 

1) 백업 주기 정책

대부분의 서버에서 접속자가 가장 낮을때는 4:00 AM ~ 4:30 AM 입니다.

그래서 많은 사람들이 새벽 4:00 에 백업이 이루어지게 설정합니다.

 

하루에 2번 백업하고 싶으면 오전/오후 4:00 에 백업을 하도록 합시다.

 

2) 백업 방식 정책

백업이라는 것이 데이터를 복사해 두는 것이기 때문에 하드디스크의 여유공간이 많아야 합니다.

# df -h

명령어를 통해서 저장할 디스크의 여유공간이 충분한지 파악해 봅시다.

 

또 백업에는 CPU의 연산이 이루어집니다. (파일을 읽어서 새로운 곳에 기록)

- 압축 백업 : (tar -czpf 백업) 일반적으로 많이 쓰이는 백업입니다. 이 작업에는 CPU 가 많이 사용됩니다.

10GB 미만 압축이면 상관없는데 그 이상의 대용량의 압축 백업은 주의가 필요합니다. 백업 시켜놓고 CPU 사용량을 확인하세요.

- 복사 백업 : (cp -R 백업) 압축하지 않고 복사만 합니다. 사용 용량을 많이 차지하지만 (압축하지 않는다는 뜻) 백업할 때 CPU 사용량이 크게 증가하지는 않습니다.

- 증분 백업 : (rsync 백업) 변동사항만 비교하여 백업합니다. 비교를 위해서 파일은 항상 압축되지 않은 상태로 보관됩니다.

 

3) 백업 유지기간 정책

- 몇일치를 보관할 것인가? 또는 몇개의 백업 파일을 보관할 것인가?

 

4) 백업 저장소 정책

- 백업 파티션을 나누어서 저장?

- 디스크를 새로 장착하여 저장?

- FTP 등을 사용해서 원격 저장?

원한다면 https://blog.lael.be/post/1387 글을 참조하여 별도의 백업서버의 폴더를 연결(mount)하여 백업을 해보도록 하자.

 


 

2. 설정된 정책을 바탕으로 백업 세팅하기

백업 정책 예시 :

- 하루 2회 오전/오후 4시에 백업.

- 파일과 디비(MYSQL or MariaDB) 백업.

- 백업 저장소는 동일 디스크의 /backup 폴더.

- 백업 파일은 10일치를 보관한다.

 

작업은 root 권한에서 실행한다.

# su -l root    나   # sudo su    등의 명령어로 root 권한으로 상승하여라.

 

1) 백업이 저장될 폴더 만들기.
# mkdir /backup

 

2) 퍼미션 조정
# chmod 700 /backup

 

3) 백업 스크립트 작성
# cd /root
# vi backup.sh

 

tar 명령어는 파일 압축 백업을 실시합니다.

mysqldump 명령어는 데이터베이스 백업을 실시합니다.

find 관련 명령어는 10일이 지난 파일을 삭제합니다.

 

-- tar 와 mysqldump 는 여러 줄 쓰셔도 됩니다.

-- 설정을 바꿀 수 있는 부분은 파란색빨간색으로 표시하였습니다.

 

#!/bin/bash
tar -czpf /backup/myuser.`date +%Y%m%d%H%M%S`.tgz /home/myuser/www 1>/dev/null 2>/dev/null
mysqldump --extended-insert=FALSE -uroot -pmypassword mydbname > /backup/mydbname.`date +%Y%m%d%H%M%S`.sql
find /backup/ -type f -mtime +10 | sort | xargs rm -f

 

아래 내용을 더블클릭해서 복사한 후 사용하여라.


#!/bin/bash
tar -czpf /backup/jingjing.`date +%Y%m%d%H%M%S`.tgz /home/jingjing 1>/dev/null 2>/dev/null
mysqldump --extended-insert=FALSE -uroot -ptest1234 mydbname > /backup/mydbname.`date +%Y%m%d%H%M%S`.sql
find /backup/ -type f -mtime +10 | sort | xargs rm -f

스크린샷 2015-06-14 오후 10.38.04

4) 백업 스크립트 실행권한 설정
# chmod 700 backup.sh

 

5) 연습삼아 실행
# ./backup.sh

 

6) 확인

# cd /backup

# ll -h

스크린샷 2015-06-14 오후 10.11.03

이 때 total 에 나온 용량과 df -h 명령어에 나온 여유공간을 비교하여 백업 정책이 적합한지 판단한다. (디스크 여유공간 비교)

backup.sh 의 find 관련 명령어에서 10 이라는 숫자를 변경하면 된다. (디스크 용량이 부족할 경우 5일치만 저장되도록 바꾸셔야겠죠?)

 

7) 주기적인 실행

cron (예약관리자 실행 프로그램)에 매일 오전/오후 4시 0분에 실행되도록 설정한다.

# crontab -e
0 4 * * * /root/backup.sh 1>/dev/null 2>/dev/null
0 16 * * * /root/backup.sh 1>/dev/null 2>/dev/null

 

 

스크린샷 2015-06-15 오후 2.17.41

 

 

8) 확인

잠자고 일어난 후 /backup 폴더에 백업이 잘 되어있나 확인해 본다.

 

17 Comments

  1. mysqldump: Got error: 1045: “Access denied for user ‘root’@’localhost’ (using password: YES)” when trying to connect

    이런 메세지가 뜨는데, 뭐가 문제일까요. 암호도 제대로 입력한 것 같은데..

    1. 암호를 잘못 입력하셨을겁니다.
      다시 한번 확인해보세요.

  2. 백업 주기를 1주일에 한번 정도로 바꾸고 싶습니다. 그러면 어떤 커멘드를 바꿔 줘야 하나요?
    리눅스는 초보라서 이런 질문 드렸습니다
    죄송합니다.

    1. 예제 기준으로
      0 4 * * 0 /root/backup.sh 1>/dev/null 2>/dev/null
      로 쓰시면 됩니다. 매주 일요일 4시에 동작합니다.

      1. 정말 감사합니다.^^

  3. tar -czpf /backup/jingjing.`date +%Y%m%d%H%M%S`.tgz /home/jingjing 1>/dev/null 2>/dev/null
    find /backup/ -type f -mtime +10 | sort | xargs rm -f

    안녕하세요~감사히 잘봤습니다.
    위에 폴더만 tar 압축해서 만들꺼라 sql은 지웠는데 60일 지난 데이터를 지울려면 +60하면 되겠죠??
    그리고 1>/dev>null 2>/dev/null 을 왜 쓰는지 의미좀 알려 주시면 감사하겠습니다.

    1. 안녕하세요.
      60일 정책으로 하시려면 그렇게 하면 됩니다.

      리눅스에서 1은 출력메시지, 2는 에러메시지를 의미하고 /dev/null 은 없다는 것을 의미합니다.
      즉 1>/dev/null 2>/dev/null 는 “출력과 에러 메시지를 표시하지 않음” 을 의미합니다.

      만약 1>/root/output.txt 2>/root/error.txt 라고 바꾸시면 앞 명령어(tar)의 출력결과를 텍스트 파일로 저장할 수 있습니다.

      1. 정말 감사합니다. 많은 도움됐습니다.

  4. 안녕하세요.
    라엘님 덕분에 서버셋팅과 보안인증서까지 잘 마쳤습니다.
    다음은 도전은 백업서버인데요.
    백업서버 계획중에 궁금한것이 생겨 질문드립니다.

    1. 백업을 로컬말고 다른 서버로도 가능한가요?
    (물리적 서버, 가상서버 포함)
    이유는 실제로 돌리는 서버에 용량이 없어서 HDD로 가상서버 백업전용으로 1대더 만들려고 합니다.
    2. 증분 백업 :
    이것이 merge방식인가요?

    연말잘보내시고 늘 건강하시길 바랍니다.

    1. 안녕하세요.
      1. 백업을 다른서버로도 가능합니다. 보통 실 운영에서는 다른 서버로 작업합니다.
      2. 증분백업은 처음 1회 전체백업 후, 이후 변경파일만 백업하는 방식입니다.

  5. 감사합니다
    라엘님 덕분에 한결 수월하게 백업 작업했습니다.

    1. 감사합니다! 백업을 설정하면 마음이 든든해진답니다.

  6. 글 올리신지 시간이 되셨지만 질문 하나 드려도 될까요?
    저는 리눅스로 데이터 분석을 진행하고 있습니다. 간혹가다가 커널을 건드려 메인하드 자체가 나가버려서 데이터 복구하는데 애를 먹어 이번에 자동 백업을 설정해 둘려고 합니다.

    혹시 find /backup/ -type f -mtime +10 | sort | xargs rm -f 이 명령어를 나누어서 확인해 봤는데
    Find를 써서 생성 10일 된 것들을 뽑고 그걸 정리해서 결과적으로 제거 하는쪽인것 같은데
    메인 하드 -> 백업용 하드로 복사만 해 두고 기간이 지나도 삭제되지 않게 할려면 find 부터 명령어를 지우면 되는 건가요???

    백업용 하드의 용량을 6TB 이상 되는 HDD로 할 예정이여서 지속적으로 보관해 두고 직접 확인해서 제거를 할 예정으로 하고 있습니다.

    1. 네. 자동삭제 코드를 작성하지 않으면, 당연히 수동삭제 모드가 됩니다!

  7. 안녕하세요
    엄청난 도움이 되었습니다.
    너무 상세하게 적어 두어서 며칠 만에 서버 셋팅을 마무리 했습니다.^^
    감사합니다.
    그런데 한가지 질문이 있어요 아직 초보라 백업 설정을 해두긴 했는데
    복구는 어떻게 하는지 궁금합니다.
    답변 부탁 드립니다.^^

    1. 안녕하세요.
      백업은 공통적인 방법으로 이루어지지만
      복구는 사용하는 소프트웨어에 따라 달라집니다.
      사용 중인 소프트웨어의 포럼 또는 구글 검색을 통해 알아보셔야 할 것 같습니다.

  8. 감사합니다. 정말 도움 많이 되었습니다.

Leave a Comment

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
*
*