프로그래밍/DB

mysql 데이터베이스 백업 스크립트

kugancity 2020. 5. 2. 17:20
728x90
반응형




mysqldump를 사용하여 데이터베이스를 매일 백업하는 쉘스크립트를 작성하였다. 



mysqldump 사용법 

   mysqldump는 DB에서 원하는 DB만, table만 백업 할 수 있고, 전체 DB를 백업 할 수 있다.


  (1) 전체 백업

    mysqldump -u계정이름 -p -A > all.sql


  (2) 특정 DB 백업

    mysqldump -u계정이름 -p 특정DB명 > 특정DB명.sql


  (3) 특정 DB에 특정 테이블 백업

    mysqldump -u계정이름 -p 특정DB명 특정table명 > 특정DB명.특정table.sql


  복원법

     mysql -u [userId] -p [password] [DB명] < 특정DB(특정table).sql


- DB 백업 스크립트 작성  

# vi /root/dbbackup.sh


mysqldump를 이용하여 디비나 테이블을 백업하고 백업한 파일은 gzip을 이용하여 압축하여 백업 폴더에 저장한다. 


- db 계정정보를 스트립트 안에 명시하는 경우 

  (스크립트에 명시적으로 계정정보를 입력하는 것은 보안상 위험 있음. 사용 예시로만 참고할 것


#!/bin/bash

DB_BACKUP="/home/dbbackup/"

DB_USER="username"

DB_PASSWD="passwd"

db="dbname"

table="tablename"


# Remove backups older than 3 days

find $DB_BACKUP -ctime +3 -exec rm -f {} \;




# 데이터베이스를 모두 백업할경우 

mysqldump --user=$DB_USER --password=$DB_PASSWD -A | gzip > "$DB_BACKUP/mysqldump-$db-$(date +%Y-%m-%d).gz";




# 데이터베이스를 백업할경우 

mysqldump --user=$DB_USER --password=$DB_PASSWD $db | gzip > "$DB_BACKUP/mysqldump-$db-$(date +%Y-%m-%d).gz";



# 데이터베이스의 특정 테이블을 백업할경우 

mysqldump --user=$DB_USER --password=$DB_PASSWD $db $table | gzip > "$DB_BACKUP/mysqldump-$db-$table-$(date +%Y-%m-%d).gz";






- db 계정정보를 my.cnt에 명시하는 경우 


my.cnt 




[mysqldump]


user=사용자이름

password=암호




스크립트 


#!/bin/bash

DB_BACKUP="/home/dbbackup/"

db="dbname"

table="tablename"


# Remove backups older than 3 days

find $DB_BACKUP -ctime +3 -exec rm -f {} \;




# 데이터베이스를 모두 백업할경우 

mysqldump  -A | gzip > "$DB_BACKUP/mysqldump-$db-$(date +%Y-%m-%d).gz";




# 데이터베이스를 백업할경우 

mysqldump  $db | gzip > "$DB_BACKUP/mysqldump-$db-$(date +%Y-%m-%d).gz";



# 데이터베이스의 특정 테이블을 백업할경우 

mysqldump  $db $table | gzip > "$DB_BACKUP/mysqldump-$db-$table-$(date +%Y-%m-%d).gz";









/root/dbbackup.sh 를 실행하여 정상적으로 스크립트가 작동하는지 확인한다. 


위와 같이 스크립트를 실행하면 정상적으로 되는데 crontab에서 실행할때는 아래와 같이  오류가 발생할 수 있다. 

cat /home/bitnami/backup_db.log
dbbackup.sh: line 8: ./mysqldump: No such file or directory




이럴 경우 which로 mysqldump 명령어의 전체 경로를 확인하여 스크립트에 명시해주면 된다. 


$ which mysqldump
/opt/bitnami/mysql/bin/mysqldump


아래와 같이 해주면 된다. 

# 데이터베이스를 모두 백업할경우 

/opt/bitnami/mysql/bin/mysqldumpmysqldump --user=$DB_USER --password=$DB_PASSWD -A | gzip > "$DB_BACKUP/mysqldump-$db-$(date +%Y-%m-%d).gz";




정상적으로 스크립트가 실행이 되면 보안을 위해 root만 수정하고 실행할수 있도록 권한 설정 

 chmod 700 /root/dbbackup.sh


- 크론택에 작업 등록 

#crontab -e



00 04 * * * /root/dbbackup.sh




매일 새벽 4시마다 디비 백업을 하도록 크론택을 등록하고 작업 완료. 




728x90
반응형