본문 바로가기
OS/Linux Server

[Shell Programming] 10. Backup

by Haengsin 2022. 3. 17.

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

 

정책 세우기

1. 백업 주기 정책

  • 언제마다 백업을 할 것인가?
    • ex) 매일 새벽 2시, 매일 오전/오후 4시, 매주 토요일 새벽1시

2. 백업 방식 정책 (데이터를 복사할 목적 디스크 혹은 저장소의 여유 공간을 먼저 파악해야 함.)

  • 백업 방식은 어떤 것인가? (백업은 파일을 읽어서 새로운 곳에 기록하는 것. 즉, CPU의 연산이 이루어진다.)
    • 압축 백업 - $ tar -czpf  : 일반적으로 많이 사용되는 백업. CPU가 많이 사용됨. 
      • 압축 해제 - $ tar -zxvf 
        • -c : 파일을 tar로 묶음.
        • -p : 파일 권한을 저장.
        • -v : 묶거나 파일을 풀 떄 과정을 화면에 출력.
        • -f : 파일 이름을 지정.
        • -C : 경로를 지정
        • -x : tar 압축을 품.
        • -z : gzip 으로 압축하거나 해제함.
    • 복사 백업 - $ cp -R  : 압축을 하지 않고 복사. 사용 용량을 많이 차지하지만, CPU 사용량이 비교적 적음.
    • 증분 백업 - $ rsync  : 변동 사항만을 비교하여 백업. 비교를 위해서 파일은 압축되지 않은 상태로 보관.

※ 대용량의 압축 백업에는 주의가 필요함. CPU 사용량을 확인해야 함. 또한, 너무 오랜 시간이 소요될 수 있음으로 주 1회 Full Backup과 매일 1회 증분 백업으로 진행하는 것도 좋음.

 

3. 백업 유지 기간 정책

  • 백업 유지 기간은?
    • 몇 일까지의 데이터를 보관할 것인가? 
      • ex) 30일 동안의 데이터 보관. 그 이상 지나면 삭제. (용량 관리를 위해)
    • 몇 개의 백업 파일을 보관할 것인가?

4. 백업 저장소 정책

  • 백업 저장소는 어떤 것인가?
    • 단일 서버 혹은 인스턴스의 파티션에 저장.
    • 단일 서버 혹은 인스턴스에 디스크를 새로 마운트하여 저장.
    • 백업 서버 혹은 스토리지에 FTP를 이용하거나 백업 솔루션을 이용하여 저장.
    • Cloud Storage Service 혹은 Docker Hub 와 같은 외부 저장소에 저장.

 

설정된 정책을 바탕으로 백업 세팅

1. 백업 정책 시나리오 (1)

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

- 파일과 데이터베이스(MySQL) 백업.

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

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

 

※ 작업은 root 권한에서 진행한다. sudo su 혹은 sudo 명령어로 권한 상승 진행

 

(1) 백업이 저장될 디렉토리(/backup) 생성

[centos@mypc-mysql ~]$ sudo mkdir /backup
[centos@mypc-mysql ~]$ ls /
backup  bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

(2) 백업 대상 디렉토리의 퍼미션 조정

[centos@mypc-mysql ~]$ sudo chmod 700 /backup
[centos@mypc-mysql ~]$ ll /
total 16
drwx------   2 root root    6 Mar 17 16:11 backup
...

(3) 백업 스크립트 작성.

#!/bin/bash

tar -czpf /backup/centos.$(date +%Y-%m-%d).tgz /home/centos 1>/dev/null 2>/dev/null
# 1>/dev/null : 표준 출력을 터미널이 아닌 파일에 출력
# 2>/dev/null : 표준 에러 출력을 터미널이 아닌 파일에 출력

mysqldump --extended-insert=FALSE -uroot -pTest1234! testdb > /backup/testdb.$(date +%Y-%m-%d).sql
# --extended-insert=False
# -user root
# -password : Test1234!i

find /backup/ -type f -mtime +10 | sort | xargs rm -f
# find 명령어로 해당 경로 아래 
# -type f (file type을 찾아서)
# -mtime 10 : 파일의 데이터가 마지막으로 수정 된 날짜와 시간 (일 지정) 10일 ~ 11일 전까지
# sort : 정렬해서
# xargs rm -f : xargs 명령어는 표준 입력을 통해 명령 줄을 만들고 실행하는 데 사용. 
# 즉, 파일 개수와 상관없이 해당하는 모든 파일에 대해 rm -f 명령어를 실행하겠다는 의미.

※ find 시간 지정 옵션

옵션 요약
-mmin 파일의 데이터가 마지막으로 수정된 시간 (분 지정)
-mtime 파일의 데이터가 마지막으로 수정된 날짜와 시간 (일 지정)
-amin 파일의 데이터가 마지막으로 엑세스한 시간 (분 지정)
-atime 파일의 데이터가 마지막으로 엑세스한 날짜와 시간 (일 지정)
-cmin 파일의 데이터 및 상태가 마지막으로 수정된 시간 (분 지정)
-ctime 파일의 데이터 및 상태가 마지막으로 수정된 날짜와 시간 (일 지정)

  • -mtime n : n+1일부터 n일 전까지
  • -mtime -n : n일 전보다 새로움.
  • -mtime +n : n일 전보다 오래됨.
  • -mtime 옵션은 다중으로도 사용 가능. 
    • 예를 들어, find -mtime +1 -mtime -4. 로 사용 시, 
    • -mtime +1 : 2일(48시간) 이전에 작성, 변경된 파일 조회.
    • -mtime -4 : 4일(96시간) 이내에 작성, 변경된 파일 조회.

※ xargs 명령어

표준 입력을 통해 명령 줄을 만들고 실행하는 데 사용한다.

$ find /path -type f | xargs rm -f

위의 실행한다고 가정. 해당 path에는 find 결과 3개의 file 타입이 존재.

3개의 각각의 file에 대해서 rm -f 를 실행하라는 의미이다.

 

(4) 백업 스크립트 정상 작동 확인

(5) 스케줄링 crontab

[centos@mypc-mysql backup]$ crontab -e

0 4 * * * sudo /home/centos/bin/backup.sh 1>/dev/null 2>/dev/null
0 16 * * * sudo /home/centos/bin/backup.sh 1>/dev/null 2>/dev/null

# Crontab -l   목록보기
#         -e   수정
# 분 시 일 월 요일 명령문 > 로그위치 > 2>&1

[centos@mypc-mysql backup]$ crontab -l

 

2. 백업 정책 시나리오 (2)

- 매일 새벽 1시에 백업. 매주 일요일 새벽 1시 백업.

- 파일이 없으면 첫 백업, 존재하면 파일 증분 백업. (파일명을 일자만 표시.)

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

- 백업 파일은 30일치를 보관.

(1) 백업이 저장될 디렉토리(/backup) 생성

[centos@mypc-mysql backup]$ sudo mkdir /backup2

(2) 백업 대상 디렉토리의 퍼미션 조정

[centos@mypc-mysql backup]$ sudo chmod 755 /backup2

(3) 백업 스크립트 작성.

[centos@mypc-mysql bin]$ cat backup2.sh
#!/bin/bash

origin="/home/centos"
bak="/backup2/centos_$(date '+%d')"

if [ -e $bak ];
 then # 동일 파일 명이 존재하면증분 백업
  rsync -r $origin $bak
 else # 아니면 생성 후 백업
  cp -R $origin $bak
fi

# 파일이 수정된지 30일이 지난 파일에 대해서 삭제 진행
find /backup2/ -type f -mtime +30 | sort | xargs rm -f

(4) 스케줄링 crontab

[centos@mypc-mysql backup]$ crontab -e

0 1 * * * sudo /home/centos/bin/backup2.sh 1>/dev/null 2>/dev/null

[centos@mypc-mysql backup]$ crontab -l

 

Reference