Ubuntu 백업 스크립트 작성하기


    아래 설명글은 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 -u
    root -pmypassword mydbname > /backup/mydbname.`date +%Y%m%d%H%M%S`.sql
    find /backup/ -type f -mtime +
    10 | sort | xargs rm -f

     

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

    1

    2

    3

    4

    #!/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

    4) 백업 스크립트 실행권한 설정

    # chmod 700 backup.sh

     

    5) 연습삼아 실행

    # ./backup.sh

     

    6) 확인

    # cd /backup

    ll -h

    이 때 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 폴더에 백업이 잘 되어있나 확인해 본다.

     

     

    ---------------------윗 글을 참고해서 백업 쉘을 한번 만들어보았다.------------------------

    백업폴더 뒤에 날짜마다 자동적으로 생성되는 기능을 추가!

    --------------------------------0000.sh------------------------------------------------------

    #!/usr/bin/expect

     set DATE [exec date +%F]

    spawn rsync -avzu --progress -e "ssh -p 22"   admin@192.168.0.255:/Main/ /data/customer_backup/customer_$DATE

    expect "password:"

    send "비밀번호\n"

    set timeout 360000

    expect eof

    if [catch wait] {

       puts "rsync2 failed"

       exit 1

    }

     

     

    exit 0

     

     

     

    ------------------------------------------------------------------------------------------------

    Crontab -l   목록보기

               -e  수정


    Mm hh dom mon dow command

    00 01 01 12 * /root.backup.sh > /root/log.log 2>&1

    요일 명령문 > 로그위치 > 2>&1

     

     

    * 2개월에 한번씩 전체 백업한 결과!

+ Recent posts