Crontab DB 자동 백업

이전 개발 사이트에 있던 백업본 입니다.

DB Data 를 NAS 에 주기적으로 백업하는 글을 정리했습니다.


이전 개발 사이트 운영 시, 라즈베리파이 서버의 SD 카드에 배드 섹터가 발생하면서, 모든 DB 데이터가 날라갔었던 아픔..이 있었습니다. 당시에도 Crontab 으로 주기적인 백업을 설정 했었으나, 제대로 된 설정을 하지 않아 DB 껍데기만 저장하고 있었고, 

이번 기회에 제대로 정리하는 글을 남겨보려 합니다.


작업 순서

1. vsftpd 설치

2. DB 백업 및 NAS 에 백업 파일 전송

3. Crontab 등록 


1.vsftpd 설치

ftp 패키지 설치


$ sudo apt-get update $ sudo apt-get install vsftpd #vsftpd 가 정상 동작중인지 확인 sudo service vsftpd status

ftp 기본 설정 

/etc/vsftpd.conf


# Run standalone? vsftpd can run either from an inetd or as a standalone # daemon started from an initscript. listen=NO # Allow anonymous FTP? (Disabled by default). anonymous_enable=NO # Uncomment this to allow local users to log in. local_enable=YES # Uncomment this to enable any form of FTP write command. write_enable=YES # Default umask for local users is 077. You may wish to change this to 022, # if your users expect that (022 is used by most other ftpd's) local_umask=022 # Activate directory messages - messages given to remote users when they # go into a certain directory. dirmessage_enable=YES # ASCII mangling is a horrible feature of the protocol. ascii_upload_enable=YES ascii_download_enable=YES # You may specify an explicit list of local users to chroot() to their home # directory. If chroot_local_user is YES, then this list becomes a list of # users to NOT chroot(). # (Warning! chroot'ing can be very dangerous. If using chroot, make sure that # the user does not have write access to the top level directory within the # chroot) chroot_local_user=YES chroot_list_enable=YES # Uncomment this to indicate that vsftpd use a utf8 filesystem. utf8_filesystem=YES allow_writeable_chroot=YES


2.Mysql Backup Shell 작성

Shell 파라미터는 DB password 관련 파라미터와, 날짜 파라미터를 세팅해 둔 후, 아래 로직으로 수행합니다. 


1. DB 백업 및 백업 날짜 기록.

2. 백업 파일 권한 부여

3. 5일 지난 백업 파일 삭제 

4. FTP 파일 전송 


mysql_backup.sh


#!/bin/bash DATE=`date +"%Y-%m-%d"` PREV_2DATE=`date --date '1 days ago' +"%Y-%m-%d"` PREV_5DATE=`date --date '5 days ago' +"%Y-%m-%d"` FILE="/home/pi/Desktop/dbBackUp/backup_${PREV_5DATE}.sql" # mysqldump 백업 mysqldump -upi -p'password' db_name > /home/pi/Desktop/dbBackUp/back$ echo "${DATE} backup is finised" > /home/pi/Desktop/backup.log # 백업 파일 권한 부여 chmod 777 /home/pi/Desktop/dbBackUp/backup_${DATE}.sql # 5일 지난 파일 삭제 if test -e "${FILE}"; then rm ${FILE} fi # ftp 전송 expect -c " set timeout 5 spawn env LANG=C /usr/bin/sftp pi@xxx.xxx.xxx.xxx expect \"password:\" send \"Password\n\" expect \"sftp>\" send \"cd /home/directory/backUpdir\n\" expect \"sftp>\" send \"pwd\n\" expect \"sftp>\" send \"lcd /home/pi/Desktop/dbBackUp\n\" expect \"sftp\" send \"mput *.sql\n\" expect \"sftp>\" send \"bye\n\" "

* 해당 shell 을 실행 후, 정상적으로 DB 백업이 되는지 확인합니다. 



3. Crontab 등록 

  • 현업 에서, 반도체 설비의 여러 생산성 지표를 뽑아내기 위해서, 방대한 SQL 을 Pro*c 를 이용해서 Crontab 에 등록해 주기적으로 배치 잡을 돌리고 있습니다.
  • 여기서는 위에서 등록한 sh 파일을 크론탭에 등록하여 매일 01 시에 배치 잡을 돌리도록 설정합니다.



Crontab 사용법

리눅스 쉘에서 아래와 같이 입력합니다

*크롭탭의 경우 혹시 모를 권한 이슈를 위해 sudo 권한으로 작성합니다.

sudo crontab -e

vim 파일 형태의 편집 화면으로 들어가게 되며, 해당 명령어로 크론탭을 설정할 수 있는 장소로 들어오게 됩니다.

여기에 여러 크론잡을 입력 후 콜론(:) 입력 후에 wq 를 입력해 크론탭을 갱신시킵니다. 



반대로 현재 크론탭에 어떤 내용이 들어있는지 보려면 아래처럼 입렵합니다.

sudo crontab -l 

그러면 cat 명령어로 파일을 읽어들인 것 처럼 표준 출력으로 크론탭 내용이 나오게 됩니다.



마지막으로 크론탭을 삭제하려면 아래 명령어를 입력합니다.

sudo crontab -r 


Cron 배치 주기 설정

*      *      *      *      *
분(0-59)  시간(0-23)  일(1-31)  월(1-12)   요일(0-7)

각 '*' 위치에 따라 주기를 다르게 설정할 수 있습니다.  순서대로 '분' '시간' '일' '월' '요일'  순입니다.

그리고 괄호 안의 숫자 범위 내로 별 대신 입력할 수 있습니다.


* 요일에서 0 과 7 일 '일요일' 이며 1부터 월요일, 6은 토요일 입니다.



 

Crontab 등록

0 1 * * * /home/pi/Desktop/mysql_backup.sh

위에서 등록한 mysql_backup.sh 을 매일 01시 에 돌리도록 등록합니다.






Cron 등록 예제

매분 실행

# 매분 test.sh 실행
* * * * * /home/script/test.sh

특정 시간 실행

# 매주 금요일 오전 5시 45분에 test.sh 를 실행
45 5 * * 5 /home/script/test.sh

반복 실행

# 매일 매시간 0분, 20분, 40분에 test.sh 를 실행
0,20,40 * * * * /home/script/test.sh

범위 실행

# 매일 1시 0분부터 30분까지 매분 tesh.sh 를 실행
0-30 1 * * * /home/script/test.sh

간격 실행

# 매 10분마다 test.sh 를 실행
*/10 * * * * /home/script/test.sh


응용 실행

# 5일에서 6일까지 2시,3시,4시에 매 10분마다 test.sh 를 실행
*/10 2,3,4 5-6 * * /home/script/test.sh