Ubuntu 백업 스크립트 작성하기

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

https://blog.lael.be/post/1449

아래 설명글은 Ubuntu 뿐만 아니라 모든 Linux 배포판에 대해서 공통적으로 실행가능합니다.
서버를 운영하면서, 백업과 보안항상 염두해 두어야 하는 사항이다.

 

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

 

* Dropbox 에 원격 자동 백업하는 방법은 여기에 : https://blog.lael.be/post/5952

 

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

[TIP] cron 에 여러 명령어를 등록하여 해결하지 않고 쉘 스크립트를 작성하는 이유 : cron 은 순차 처리를 할 수 없습니다.
즉, 백업 한 후에, 압축하고, 파일전송을 하는 등의 순차적인(sequential) 작업을 하려면 반드시 shell script 로 작성하셔야 합니다.

 

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 -hlocalhost -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 -hlocalhost -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

 

 

 

 

8) 확인

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

 

47 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. 감사합니다. 정말 도움 많이 되었습니다.

  9. 라엘님
    운영하는 계정과 홈페이지가 여러개라면 아래처럼 해주면 되나요?
    사소하고 쉬운 질문인데 리눅스에는 자신이 없어 질문드립니다.

    #!/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 -hlocalhost -uroot -pmypassword mydbname > /backup/mydbname.`date +%Y%m%d%H%M%S`.sql

    tar -czpf /backup/myuser2.`date +%Y%m%d%H%M%S`.tgz /home/myuser2/www 1>/dev/null 2>/dev/null
    mysqldump –extended-insert=FALSE -hlocalhost -uroot -pmypassword mydbname2 > /backup/mydbname2.`date +%Y%m%d%H%M%S`.sql

    find /backup/ -type f -mtime +10 | sort | xargs rm -f

    1. 네 맞습니다. 경로에 맞추어서 여러줄 쓰시면 됩니다.

      1. 답변주셔서 감사합니다.

  10. 라엘님 안녕하세요?
    많은 것을 배우고 있어서 너무 감사합니다.

    혹시 파일 압축 백업을 할 때 특정 폴더는 빼고 압축할 수 있을까요?
    /home/myuser/www 에서 /home/myuser/www/aaa/data 와 /home/myuser/www/bbb/data 이렇게 두개의 폴더는 제외하고 싶습니다.
    그누보드에서 사진과 썸네일이 저장되는 폴더인데 백업할 필요가 없는데 용량을 몇기가씩 차지합니다.

    도움 주시면 정말 감사하겠습니다.

  11. tar문 뒤에 –exclude /home/myuser/www/aaa/data –exclude /home/myuser/www/bbb/data 이렇게 해결했습니다. 감사합니다.

  12. 라엘님 안녕하세요
    제 우분투 서버 16.04의 하드는 SSD 250G 사용하는데
    용량이 다 차서 하루를 제외한 백업은 지워도 공간이 거의 없네요.

    현재 WD RED 하드가 있기는 한데
    속도가 느려질까봐 걱정이기도 하고

    다시 우분투 서버 설치하고 설정하려니 막막하네요

    1. 가끔씩 생각날때 수동 외부백업하시고, 백업을 꺼보세요.

      1. 네 감사합니다.
        라엘님이 알려주신 Dropbox와 헤놀로지에
        새벽 4시마다 복사되게 해놓은 상태입니다.

        서버하드 날아가고, 헤놀로지 다 날아간 뒤로는
        집안에서 운영하는 nas는 믿지 못하기에
        dropbox 1TB 결제 직전입니다.

        추천인은 라엘님으로 되어있습니다.

        조금전 아이디어가 떠올랐습니다.

        어차피 가상서버니
        마이크론 SSD 250G는 mariaDB만 설치하고

        나머지 홈페이지에 들어가는 파일 그리고 첨부파일등은 HDD로
        가상서버 한대 더 구성해서

        DB서버와 파일서버 분리하는것도 좋은 방안이 될수 있을까요?

        좋은 주말 되세요

  13. 백업스크립트중 /home/myuser/www 이건 백업할 경로인가요?
    즉, 예를 들어서 라이믹스가 /var/www/html 경로에 설치되어있다면, /home/myuser/www 이거 대신 /var/www/html 이걸 써도 되는거죠?

  14. 또 모르는게 생겨서 글을 남깁니다 ㅠㅠ
    디스크 용량이 자꾸 차서 mtime을 1로 바꿨습니다.
    근데도 용량이 너무 빨리 꽉차서 이 /backup 폴더에서 오래된 백업 파일을 주기적으로 삭제하고 있습니다.
    /backup 폴더에서 몇개의 파일만 빼고 주기적으로 삭제해주는 스크립트가 있을까요?

    예를 들어 /backup 폴더에 1.tgz 1.sql 이게 있다고 치면, 다음날 4시에 2.tgz , 2.sql이 생기잖아요?
    그럼 1.tgz,1.sql은 자동삭제되게 하는 스크립트가 있을까요?

    1. 파일명에서 date 변수부분을 빼면 덮어쓰기됩니다.

      1. `date +%Y%m%d%H%M%S’ 이부분을 제거하면 되죠?

        1. jingjing.`date +%Y%m%d%H%M%S`.tgz 이게 파일명인데, mybackup.tgz 로 하시면 됩니다.

  15. 안녕하세요.
    저장공간이 갑자기 다 차 확인해보니 백업삭제 오류로 삭제가 안됬어요.
    back.sh를 실행하면 xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option 뜹니다.

    1. 백업 코드 부분을 잘못쓰신것 같습니다.
      백업은 화면의 코드는 ‘ 가 아니라 `(키보드 ~ 표시 버튼) 입니다.

      1. 그 문제가 아닌것 같습니다.
        위 코드를 직접 복사해서 붙혀넣기 했습니다.backup.sh를 실행하면 백업은 되는데 삭제가 안되는거 같습니다.
        find /home/xxx/backup/ -type f -mtime +3 | sort | xargs rm -f 명령만 실행하면 위와 같은 에러가 뜹니다.

        1. /home/xxx/backup/ 위치의 파일이름 목록을 알려주세요.

          1. 목록을 알려달라고 해서 혹시나 하고 백업위치에 있는 directory 를 삭제하니 잘 됩니다.f 외 다른문서가 있으면 안되는군요.답변 감사합니다. 🙂

  16. 안녕하세요! 좋은 글 감사합니다. 이 글을 참고해서 제 백업을 진행하려고 하는데요, 백업 할 용량이 많다보니 압축백업은 무리가 있을거같아 (테스트해보니 4시간 30분 소요되더라구요..) 복사 백업으로 진행하려고 하는 과정에서 문제가 생겨 질문 드립니다.

    1. 디렉토리로 생성하는 경우 디렉토리 명에 `date+%Y%m%d`가 사용되지 않던데 혹시 디렉토리명에도 날짜를 넣을 수 있나요? (백업 디렉토리를 3개 정도 보유하려고 하다보니 디렉토리 간 이름 구분이 필요하네요)

    2. find 명령어를 이용하여 오래된 파일을 삭제하는 명령어 부분에서 디렉토리를 검색하여 삭제하려다보니 현재 경로(/.)도 디렉토리로 인식하여 삭제되더라구요.. 디렉토리 삭제 시 명령어를 어떤식으로 옵션을 주면 백업 디렉토리만 삭제 가능할까요?

    1. 이건 제가 따로 확인 후 알려드려야 할 것 같습니다.
      find 명령어에서는 최소 깊이 제한을 걸면 될것 같습니다. -mindepth 같은 옵션이 있습니다.

      1. 네 감사합니다. 일단 무리가 가더라도 압축백업으로 설정 해놓고 사용해보려곤 합니다.

  17. 라엘 님 혹시 어디가 잘못 된건지 알 수 있을까요?
    /root/ssl/reboot.sh 입력하면 재부팅 잘 됩니다.
    그런데, 아래처럼 크론탭에 등록하니까 먹통이네요.

    1.
    /root/ssl/reboot.sh 파일의 소스
    ——————————————————
    #!/bin/bash
    reboot
    ——————————————————

    2.
    crontab 소스
    ——————————————————
    30 2 * * * /root/ssl/reboot.sh
    ——————————————————

    3.
    reboot.sh 파일의 권한설정 상태
    ——————————————————-
    -rwx—— 1 root root 19 Jun 25 10:55 reboot.sh
    ——————————————————–

    1. 그냥 crontab 에서 /sbin/reboot 을 호출하는건 어떤가요?

      1. 말씀해주신 곳을 불러와 재부팅 시키는 건 잘 되더라구요.
        제가 해보려던 건,
        따로 폴더 만들어 sh 파일을 별도 관리해보려고 연습 중이라…
        걍, 그작작 그곳의 녀석을 써야 할 것 같아요.

        답변 감사합니다.

        ps.
        이 질문 댓글을 어디 글에 달았는지 기억이 안 나서 찾느라 혼났습니다. ㅋ

  18. 라엘 님, 궁금한 게 또 생겼는데요 ^^;;
    root 권한으로 백업할 때 비밀번호 입력 없이 엔터키 2번 쳐주면 비밀번호 입력 패스되면서 백업 되잖아요.

    위 스크립트 따라 작성해서 테스트 차 ./backup.sh 실행시켜 봤더니, 비밀번호 입력하라는 단계에서 진행이 멈춰버리더라구요. 혹시, sh 파일에 별도로 root나 계정DB 비밀번호 입력하지 않고 【엔터키 2번 입력]이 자동으로 되게 하려면 아래 코드를 어떤 식으로 수정해줘야 하는지?

    #!/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 -hlocalhost -uroot -pmypassword mydbname > /backup/mydbname.`date +%Y%m%d%H%M%S`.sql [이 부분에 엔터키2번 입력 과정이 들어가야 함]
    find /backup/ -type f -mtime +10 | sort | xargs rm -f

    1. 자동 로그인으로 등의 사유로 인해 비밀번호 입력이 필요 없다면, -p 옵션을 빼보세요. 해당 옵션은 비밀번호를 무조건 물어보라는 옵션입니다.

      1. 아하, 그렇군요. 덕분에 놀라운 사실 알았습니다. 감사합니다.

  19. 라엘 님,

    tar -czpf 는 tar 압축 잘 되는데, tar -cfzp는 압축이 안 되는 걸까요?
    2번이나 테스트해봤는데, sql 파일만 생성되고 tar 파일은 생성이 안 되네요.

    저는 이제까지 기억하기 편한 순서인 cfzp 순 이용해
    tar cfzp backup.tgz * 형식 명령어로 수동백업 압축해왔거든요. ㅜㅜ

    tar 옵션 순서도 따로 있나요?

    1. 순서 상관 없습니다.
      다른 문제가 잇을것 같네요.

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>
*
*