리눅스 시스템에서 주기적으로 파일과 데이터베이스 백업을 하는 방법.
정책 세우기
1. 백업 주기 정책
- 언제마다 백업을 할 것인가?
- ex) 매일 새벽 2시, 매일 오전/오후 4시, 매주 토요일 새벽1시
2. 백업 방식 정책 (데이터를 복사할 목적 디스크 혹은 저장소의 여유 공간을 먼저 파악해야 함.)
- 백업 방식은 어떤 것인가? (백업은 파일을 읽어서 새로운 곳에 기록하는 것. 즉, CPU의 연산이 이루어진다.)
- 압축 백업 - $ tar -czpf : 일반적으로 많이 사용되는 백업. CPU가 많이 사용됨.
- 압축 해제 - $ tar -zxvf
- -c : 파일을 tar로 묶음.
- -p : 파일 권한을 저장.
- -v : 묶거나 파일을 풀 떄 과정을 화면에 출력.
- -f : 파일 이름을 지정.
- -C : 경로를 지정
- -x : tar 압축을 품.
- -z : gzip 으로 압축하거나 해제함.
- 압축 해제 - $ tar -zxvf
- 복사 백업 - $ cp -R : 압축을 하지 않고 복사. 사용 용량을 많이 차지하지만, CPU 사용량이 비교적 적음.
- 증분 백업 - $ rsync : 변동 사항만을 비교하여 백업. 비교를 위해서 파일은 압축되지 않은 상태로 보관.
- 압축 백업 - $ tar -czpf : 일반적으로 많이 사용되는 백업. CPU가 많이 사용됨.
※ 대용량의 압축 백업에는 주의가 필요함. 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
'OS > Linux Server' 카테고리의 다른 글
[Linux] 01. 운영체제의 구조와 특징 (0) | 2022.05.23 |
---|---|
[리눅스커널이야기] top 을 통해 살펴보는 프로세스 정보들 (0) | 2022.04.07 |
[Shell Programming] 9. Looping (0) | 2022.03.11 |
[Shell Programming] 8. Branching (0) | 2022.03.08 |
[Shell Programming] 7. Input & Output (0) | 2022.03.07 |