MYSQL

MYSQL 정기백업 스크립트


MYSQL 정기백업 스크립트


  2021-09-25  333 View 공개

운영하는 시스템에 MySql 데이터를 crone tab을 이용하여 정기적으로 백업을 받는 설정을 하기로 했다.

MySql에서 제공하는 mysqldump 를 이용하여 매일 새벽 1시에 Full Dump를 해당 날짜의 이름으로 받아서 압축 하고 1주일 이상 지난 덤프파일은 삭제 하는 방식으로 스크립트를 만들었다.

mysqldump를 사용하기 위해  root 계정으로 진행 하였다.

 

/usr/local/backup/mysql/backup.sh 내용

#!/bin/bash 
echo '[$(date +%Y-%m-%d) $(date +%H:%M:%S)] start backup'
export backup_file_name='MySystem_db_backup_$(date +%Y%m%d)' echo '[$(date +%Y-%m-%d) $(date +%H:%M:%S)] start backup'
#echo ${backup_file_name} 
echo '[$(date +%Y-%m-%d) $(date +%H:%M:%S)] daily backup start dump : ${backup_file_name}'
/usr/bin/mysqldump -uDBUSERID -pDBUSERPW DBNAME > /usr/local/backup/mysql/${backup_file_name}.sql
echo '[$(date +%Y-%m-%d) $(date +%H:%M:%S)] daily backup compress : ${backup_file_name}.sql to ${backup_file_name}.sql.tar.gz'
/usr/bin/tar cvfpzR /usr/local/backup/mysql/${backup_file_name}.tar.gz /usr/local/backup/mysql/${backup_file_name}.sql 
echo '[$(date +%Y-%m-%d) $(date +%H:%M:%S)] daily backup delete dump : ${backup_file_name}.sql'
/usr/bin/rm /usr/local/backup/mysql/${backup_file_name}.sql
echo '[$(date +%Y-%m-%d) $(date +%H:%M:%S)] end backup successfully'

※ 각 명령의 수행 시간을 로그에 남기도록 추가 하였다. echo ...

위 스트립트는 실행하면 지정한 DBNAME에 해당하는 데이터베이스를 MySystem_db_backup_YYYYMMDD.sql 파일로 dump 받고 해당 파일을 tar.gz 파일로 압축 후 sql 파일을 삭제하는 명령을 순서대로 기술 한 것이다.

MySQL 계정과 비밀번호가 적혀 있으므로 다른 계정에서는 접근 못하도록 퍼미션 변경

[root@localhost mysql]# chmod 600 backup.sh

[root@localhost mysql]# ls -al backup.sh[root@localhost mysql]# ls -al backup.sh
-rw-------. 1 root root 382 10월 11  2018 backup.sh
[root@localhost mysql]#

 

이제 매일 7일 지난 백업 파일을 삭제하는 스크립트를 만들어 보자

/usr/local/backup/mysql/delete_backup.sh 내용

===================================================================

#!/bin/bash
/usr/bin/find /usr/local/backup/mysql -name '*.tar.gz' -mtime +7 -exec rm {} \;

===================================================================

위 스크립트는 백업 폴더에 *.tar.gz 에 해당하는 모든 파일 중 생성된지 7일이 지난 파일을 삭제하는 명령이다.

코맨드 라인에서 개별로 실행 했을 때 잘 시행 된다면 크론텝에 등록하자.

[root@localhost mysql]#crontab -e 

아래 내용을 입력하고 저장한다.

0 0 * * * /usr/local/backup/mysql/backup.sh >> /usr/local/backup/mysql/backup.log
0 1 * * * /usr/local/backup/mysql/delete_backup.sh >> /usr/local/backup/mysql/backup.log

위 내용은 매일 0시에 backup.sh 를 실행하고 STDOUT으로 출력되는 내용은  backup.log 파일에 추가

매일 1시에 최근 7일 이전에 생성된 backup 파일을 삭제하고 STDOUT으로 출력되는 내용은 backup.log 파일에 추가

크론텝에 잘 지정이 되었는지 확인

[root@localhost mysql]# crontab -l
0 0 * * * /usr/local/backup/mysql/backup.sh >> /usr/local/backup/mysql/backup.log
0 1 * * * /usr/local/backup/mysql/delete_backup.sh >> /usr/local/backup/mysql/backup.log
[root@localhost mysql]#

이후에 /usr/local/backup/mysql 폴더에

[root@localhost mysql]# ls -al 
합계 6888652 
drwxr-xr-x. 2 root root      4096 12월 23 01:00 . 
drwxr-xr-x. 3 root root        19  9월 18  2018 .. 
-rw-r--r--. 1 root root 878195635 12월 16 00:02 MYSystem_db_back_20191216.tar.gz 
-rw-r--r--. 1 root root 879246960 12월 17 00:02 MYSystem_db_back_20191217.tar.gz 
-rw-r--r--. 1 root root 880465270 12월 18 00:02 MYSystem_db_back_20191218.tar.gz 
-rw-r--r--. 1 root root 881659467 12월 19 00:02 MYSystem_db_back_20191219.tar.gz 
-rw-r--r--. 1 root root 882824252 12월 20 00:02 MYSystem_db_back_20191220.tar.gz 
-rw-r--r--. 1 root root 883832714 12월 21 00:02 MYSystem_db_back_20191221.tar.gz 
-rw-r--r--. 1 root root 883838930 12월 22 00:02 MYSystem_db_back_20191222.tar.gz 
-rw-r--r--. 1 root root 883857070 12월 23 00:02 MYSystem_db_back_20191223.tar.gz 
-rw-r--r--. 1 root root     28840 12월 23 00:00 backup.log 
-rw-------. 1 root root       382 10월 11  2018 backup.sh 
-rw-r--r-x. 1 root root        92 10월 11  2018 delete_backup.sh 
[root@localhost mysql]# 

이런 식으로 Dump파일이 압축되어 저장된다.


Tags  #MySql  



🚩 MYSQL 글 모음 (총 37 건)

[macOS] zsh: command not found: mysql 해결 방법

Last Updated : 2023-09-29
#MySql

Mysql DB생성 및 유저등록

Last Updated : 2023-09-29
#Mysql

Mysql 백업 및 복구

Last Updated : 2023-09-29
#MySql

MySql - POD 예제

Last Updated : 2023-09-29
#MySql

데이터베이스에서 작은따옴표(')를 다루는 방법 : SQL 인젝션 예방과 데이터 출력

Last Updated : 2023-09-29
#Mysql

[mySQL] 특정 레코드가 몇 번째인지 알아내는 방법

Last Updated : 2023-09-10
#mySQL #row_number