MySQL自动化(全量+增量)备份脚本

MySQL自动化(全量+增量)备份脚本

文章转自:http://www.it-hack.cn/forum.php?mod=viewthread&tid=220&extra=page%3D1

一、MySQL的日常备份方案:

全备+增量备份:

1、周日凌晨三点进行全备;

2、周一到周日增量备份。

不是往常的周日全备份,周一到周六增量备份,这样如果周日数据库在完全备份前出问题,恢复完成后,会少周日一天的数据量,所以七天增量备份,周日全备可以更好的保全数据。

这是备份周期演示表:

Sun 3:00------Mon 3:00-----------------Tue 3:00----------Wed 3:00----------Thu 3:00----------Fri 3:00----------Sat 3:00----------Sun 3:00
(flush)Sun full---(flush)Sun->Mon binlog---(flush)Mon->Tue---(flush)Tue->Wed---(flush)Wed->Thu---(flush)Thu->Fri---(flush)Fri->Sat---(flush)Sun full---(flush)Sun->Mon binlog---(flush)Mon->Tue---(flush)Tue->Wed---(flush)Wed->Thu---(flush)Thu->Fri---(flush)Fri->Sat---(flush)Sun full

二、备份脚本:

模块化定制,可以随意移动,调节备份策略!

变量栏的帐号密码,文件路径根据自己实际环境可以进行修改,自由度比较高,模块函数全变量,适用度较高,但是可能还有不完善的地方

vim /root/mysql_bakup.sh

#!/bin/bash
#Date:2017/5/2
#Author:wangpengtai
#Blog:http://wangpengtai.blog.51cto.com
#At Sunday, we will backup the completed databases and the incresed binary log during Saturday to Sunday.
#In other weekdays, we only backup the increaing binary log at that day!
################################
#the globle variables for MySQL#
################################
DB_USER='root'
DB_PASSWORD='123456'
DB_PORT='3306'
BACKUPDIR='/tmp/mysqlbakup'
BACKUPDIR_OLDER='/tmp/mysqlbakup_older'
DB_PID='/data/mysql/log/mysqld.pid'
DB_SOCK='/data/mysql/log/mysql.sock'
LOG_DIR='/data/mysql/log'
BACKUP_LOG='/tmp/mysqlbakup/backup.log'
DB_BIN='/usr/local/mysql/bin'
#time variables for completed backup
FULL_BAKDAY='Sunday'
TODAY=`date +%A`
DATE=`date +%Y%m%d`
###########################
#time variables for binlog#
###########################
#liftcycle for saving binlog
DELETE_OLDLOG_TIME=(date"d14dayago"+ (date"−d14dayago"+(date "-d 1 day ago" +"%Y-%m-%d %H:%M:%S")

#BINLOG_LIST=`cat /data/mysql/log/mysql-bin.index`
BINLOG_INDEX='/data/mysql/log/mysql-bin.index'
##############################################
#Judge the mysql process is running or not. #
#mysql stop return 1, mysql running return 0.#
##############################################
function DB_RUN(){
if test -a DB_PID && test -aDB_PID && test -aDB_SOCK;then
return 0
else
return 1
fi
}
###################################################################################################
#Judge the bacup directory is exsit not. #
#If the mysqlbakup directory was exsited, there willed return 0. #
# If there is no a mysqlbakup directory, the fuction will create the directory and return value 1.#
###################################################################################################
function BACKDIR_EXSIT(){
if test -d BACKUPDIR;then # echo "BACKUPDIR;then # echo "BACKUPDIR was exist."
return 0
else
echo "BACKUPDIRisnotexist,nowcreateit."mkdirpv BACKUPDIRisnotexist,nowcreateit."mkdir−pvBACKUPDIR
return 1
fi
}
###################################################################################################
#Judge the binlog is configed or not. #
#If the mysqlbakup directory was exsited, there willed return 0. #
# If there is no a mysqlbakup directory, the fuction will create the directory and return value 1.#
###################################################################################################
function BINLOG_EXSIT(){
if test -f BINLOG_INDEX;then # echo "BINLOG_INDEX;then # echo "BACKUPDIR was exist."
return 0
fi
}
###################################################
#The full backup for all Databases #
#This function is use to backup the all databases.#
###################################################
function FULL_BAKUP(){
echo "At `date +%D\ %T`: Starting full backup the MySQL DB ... "
# rm -fr BACKUPDIR/db_fullbak_BACKUPDIR/db_fullbak_DATE.sql #for test !!
DB B IN/mysqldumplockalltablesflushlogsmasterdata=2u DBBIN/mysqldump−−lock−all−tables−−flush−logs−−master−data=2−uDB_USER -pDB P ASSWORDP DBPASSWORD−PDB_PORT -A |gzip > BACKUPDIR/db_fullbak_BACKUPDIR/db_fullbak_DATE.sql.gz
FULL_HEALTH=`echo ?if[[ ?‘if[[FULL_HEALTH == 0 ]];then
echo "At `date +%D\ %T`: MySQL DB incresed backup successfully"
else
echo "MySQL DB full backup failed!"
fi
}
#python
# >>> with open('/data/mysql/log/mysql-bin.index','r') as obj:
# ... for i in obj:
# ... print os.path.basename(i)
# ...
# mysql-bin.000006
# mysql-bin.000007
# mysql-bin.000008
# mysql-bin.000009
function INCREASE_BAKUP(){
echo "At `date +%D\ %T`: Starting increased backup the MySQL DB ... "
DB B IN/mysqladminu DBBIN/mysqladmin−uDB_USER -pDB P ASSWORDP DBPASSWORD−PDB_PORT flush-logs
DB B IN/mysqlu DBBIN/mysql−uDB_USER -pDB P ASSWORDP DBPASSWORD−PDB_PORT -e "purge master logs before DELETE O LDLOG T IME"foriincat DELETEOLDLOGTIME"foriin‘catBINLOG_INDEX`
do
DB B IN/mysqlbinlogu DBBIN/mysqlbinlog−uDB_USER -pDB P ASSWORDP DBPASSWORD−PDB_PORT --start-datetime="START B ACKUPBINLOG T IMEPOINT" STARTBACKUPBINLOGTIMEPOINT"i |gzip >> BACKUPDIR/db_daily_BACKUPDIR/db_daily_DATE.sql.gz
done
# DB B IN/mysqlbinlogu DBBIN/mysqlbinlog−uDB_USER -pDB P ASSWORDP DBPASSWORD−PDB_PORT --start-datetime="START B ACKUPBINLOG T IME" STARTBACKUPBINLOGTIME"LOG_DIR/mysql-bin.[0-9]* |gzip >> BACKUPDIR/db_daily_BACKUPDIR/db_daily_DATE.sql.gz
INCREASE_HEALTH=`echo ?if[[ ?‘if[[INCREASE_HEALTH == 0 ]];then
echo "At `date +%D\ %T`: MySQL DB incresed backup successfully"
else
echo "MySQL DB incresed backup failed!"
fi
}
function OLDER_BACKDIR_EXSIT(){
if test -d BACKUPDIR_OLDER;then # echo "BACKUPDIR_OLDER;then # echo "BACKUPDIR_OLDER was exist."
return 0
else
echo "BACKUPDIR O LDERisnotexist,nowcreateit."mkdirpv BACKUPDIROLDERisnotexist,nowcreateit."mkdir−pvBACKUPDIR_OLDER
# return 1
fi
}
function BAKUP_CLEANER(){
#move the backuped file that created time out of 7 days to the BACKUPDIR_OLDER directory
returnkey=`find BACKUPDIRname".sql.gz"mtime+7execlslhreturnkey o ld=find BACKUPDIR−name"∗.sql.gz"−mtime+7−execls−lh‘returnkeyold=‘findBACKUPDIR_OLDER -name "*.sql.gz" -mtime +14 -exec ls -lh {} \;`
if [[ returnkey!= ′′ ]];thenecho""echo"Movingtheolderbackupedfileoutof7daysto returnkey!=″]];thenecho"−−−−−−−−−−−−−−−−−−−−−−"echo"Movingtheolderbackupedfileoutof7daystoBACKUPDIR_OLDER."
echo "The moved file list is:"
find BACKUPDIRname".sql.gz"mtime+7execmv BACKUPDIR−name"∗.sql.gz"−mtime+7−execmvBACKUPDIR_OLDER \;
echo "-----------------------"
elif [[ returnkey_old != '' ]];then #delete the backuped file that created time out of 14 days from BACKUPDIR_OLDER directory. echo "Delete the older backuped file out of 14 days fromreturnkey_old != '' ]];then #delete the backuped file that created time out of 14 days from BACKUPDIR_OLDER directory. echo "Delete the older backuped file out of 14 days fromBACKUPDIR_OLDER."
echo "The deleted files list is:"
find BACKUPDIR_OLDER -name "*.sql.gz" -mtime +14 -exec rm -fr {} \; fi } #################################### #--------------main----------------# #################################### function MAIN(){ DB_RUN #Judge the process is run or not, if not run, the script will not bakup db Run_process=`echo $?` echo $? if [[ $Run_process == 0 ]];then BINLOG_EXSIT binlog_index=`echo $?` if [[ $binlog_index == 0 ]];then echo "**********START**********" echo $(date +"%y-%m-%d %H:%M:%S %A") echo "~~~~~~~~~~~~~~~~~~~~~~~" if [[ $TODAY == $FULL_BAKDAY ]];then echo "Start completed bakup ..." INCREASE_BAKUP FULL_BAKUP #full backup to all DB BAKUP_CLEANER else echo "Start increaing bakup ..." INCREASE_BAKUP fi echo "~~~~~~~~~~~~~~~~~~~~~~~" echo $(date +"%y-%m-%d %H:%M:%S %A") echo "**********END**********" else echo "**********START**********" echo $(date +"%y-%m-%d %H:%M:%S %A") echo "~~~~~~~~~~~~~~~~~~~~~~~" echo "Sorry, MySQL binlog was not configed, please config the my.cnf firstly!" echo "~~~~~~~~~~~~~~~~~~~~~~~" echo $(date +"%y-%m-%d %H:%M:%S %A") echo "**********END**********" fi else echo "**********START**********" echo $(date +"%y-%m-%d %H:%M:%S %A") echo "~~~~~~~~~~~~~~~~~~~~~~~" echo "Sorry, MySQL was not running, the db could not be backuped!" echo "~~~~~~~~~~~~~~~~~~~~~~~" echo $(date +"%y-%m-%d %H:%M:%S %A") echo "**********END**********" fi } #starting runing BACKDIR_EXSITBACKUPDIR_OLDER -name "*.sql.gz" -mtime +14 -exec rm -fr {} \; fi } #################################### #--------------main----------------# #################################### function MAIN(){ DB_RUN #Judge the process is run or not, if not run, the script will not bakup db Run_process=`echo $?` echo $? if [[ $Run_process == 0 ]];then BINLOG_EXSIT binlog_index=`echo $?` if [[ $binlog_index == 0 ]];then echo "**********START**********" echo $(date +"%y-%m-%d %H:%M:%S %A") echo "~~~~~~~~~~~~~~~~~~~~~~~" if [[ $TODAY == $FULL_BAKDAY ]];then echo "Start completed bakup ..." INCREASE_BAKUP FULL_BAKUP #full backup to all DB BAKUP_CLEANER else echo "Start increaing bakup ..." INCREASE_BAKUP fi echo "~~~~~~~~~~~~~~~~~~~~~~~" echo $(date +"%y-%m-%d %H:%M:%S %A") echo "**********END**********" else echo "**********START**********" echo $(date +"%y-%m-%d %H:%M:%S %A") echo "~~~~~~~~~~~~~~~~~~~~~~~" echo "Sorry, MySQL binlog was not configed, please config the my.cnf firstly!" echo "~~~~~~~~~~~~~~~~~~~~~~~" echo $(date +"%y-%m-%d %H:%M:%S %A") echo "**********END**********" fi else echo "**********START**********" echo $(date +"%y-%m-%d %H:%M:%S %A") echo "~~~~~~~~~~~~~~~~~~~~~~~" echo "Sorry, MySQL was not running, the db could not be backuped!" echo "~~~~~~~~~~~~~~~~~~~~~~~" echo $(date +"%y-%m-%d %H:%M:%S %A") echo "**********END**********" fi } #starting runing BACKDIR_EXSITBACKUP_LOG
OLDER_BACKDIR_EXSIT BACKUP L OGMAIN>> BACKUPLOGMAIN>>BACKUP_LOG

三、测试方法:

使用了一个测试脚本,修改日期,达到一个月的演示效果。

#!/bin/bash
for day in {1..30}
do
date -s "2017-06-$day 12:00:00"
/bin/bash /root/bakup/mysql_backup.sh
done

四、脚本使用方法:

crontab -e
0 3 * * * /bin/bash /root/bakup/mysql_bakup.sh > /dev/null 2>&1 空格

#加个空格,不然有些机器不能执行脚本

你可能感兴趣的:(mysql)