간단하게 작성해본 쉘스크립트입니다.
일자별로 시스템 전체와 DB를 백업합니다. 시스템을 통으로 백업하는데 DB를 다시 따로 백업하는 이유는 DB 장애가 발생하는 시점에서 빠르게 DB만 복구 할 수 있게 하기 위해서 입니다. 물론 시스템 전체를 백업한다는 것은 동일 환경의 서버 환경에서 복구가 가능하다는 점이고 다른 환경의 서버에서는 문제가 발생 할 수있습니다.
기본적으로 /proc, /lost+found, /mnt, /media, /sys, 그리고 백업 파일이 저장될 /backup 디렉터리는 제외하고 백업됩니다. (각 상황에 맞춰 제외 디렉터리는 설정하면 됩니다.)
#!/bin/bash # Backup Variables backupDate=$(date +%Y%m%d) || echo "Error : Not init variable(backupDate)" backupDir=/backup/ || echo "Error : Not init variable(backupDir)" # Make backup directory mkdir "${backupDir}${backupDate}" || echo "Error : Not created sub directory" # Start log echo "System backup start - $(date +%Y-%m-%d) $(date +%H:%M:%S)" # File system Backup tar cvpzf "${backupDir}${backupDate}"/system_"${backupDate}".tar.gz --exclude=/proc --exclude=/lost+found --exclude=/mnt --exclude=/media --exclude=/sys --exclude=/backup / || echo "Error : System backup failed." echo "End system files backup - $(date +%Y-%m-%d) $(date +%H:%M:%S)" # DB Backup mysqldump -u[유저] -p[패스워드] [DB명] > "${backupDir}${backupDate}"/DB_"${backupDate}".sql || echo "Error : DB backup failed." echo "End DB backup - $(date +%Y-%m-%d) $(date +%H:%M:%S)" # End log echo "End backup - ${backupDir}${backupDate}.tar.gz"
쉘스크립트를 실행하게 되면 /backup/ 디렉터리에 오늘 날짜로 디렉터리가 생기고 시스템 백업본 tar.gz 파일과 sql 덤프 파일이 생성됩니다.
이것을 주기적으로 백업을 돌리기 위해서는 crontab을 이용해야겠죠.
crontab -e 를 이용해 cron을 아래와 같이 등록합니다.
# 매월 30일 0시 1분에 정기 백업 1 0 30 * * /bin/sh /backup/backup.sh > /backup/backup.log
저 같은 경우는 매월 30일 00시 01분에 실행되도록 등록을 시켰고 bakcup.log 파일을 남기도록 설정 했습니다.