您好,登錄后才能下訂單哦!
一、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 "-d 14 day ago" +%Y%m%d%H%M%S) #The start time point to backup binlog, the usage of mysqlbinlog is --start-datetime, --stop-datetime, time format is %Y%m%d%H%M%S, eg:20170502171054, time zones is [start-datetime, stop-datetime) #The date to start backup binlog is yesterday at this very moment! START_BACKUPBINLOG_TIMEPOINT=$(date "-d 1 day ago" +"%Y-%m-%d %H:%M:%S") #BINLOG_LIST=`cat /data/mysql/log/mysql-bin.index` #注意在my.cnf中配置binlog文件位置時需要使用絕對路徑,一定想成好習慣,不要給別人挖坑!! #####################舉例######################## #[mysqld] #log_bin = /var/lib/mysql/mysql-bin #####################舉例######################## 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 -a $DB_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 was exist." return 0 else echo "$BACKUPDIR is not exist, now create it." mkdir -pv $BACKUPDIR 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 "$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_$DATE.sql #for test !! $DB_BIN/mysqldump --lock-all-tables --flush-logs --master-data=2 -u$DB_USER -p$DB_PASSWORD -P$DB_PORT -A |gzip > $BACKUPDIR/db_fullbak_$DATE.sql.gz FULL_HEALTH=`echo $?` 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_BIN/mysqladmin -u$DB_USER -p$DB_PASSWORD -P$DB_PORT flush-logs $DB_BIN/mysql -u$DB_USER -p$DB_PASSWORD -P$DB_PORT -e "purge master logs before ${DELETE_OLDLOG_TIME}" for i in `cat $BINLOG_INDEX | awk -F'/' '{print $NF}'` do $DB_BIN/mysqlbinlog -u$DB_USER -p$DB_PASSWORD -P$DB_PORT --start-datetime="$START_BACKUPBINLOG_TIMEPOINT" $LOG_DIR/$i |gzip >> $BACKUPDIR/db_daily_$DATE.sql.gz done # $DB_BIN/mysqlbinlog -u$DB_USER -p$DB_PASSWORD -P$DB_PORT --start-datetime="$START_BACKUPBINLOG_TIME" $LOG_DIR/mysql-bin.[0-9]* |gzip >> $BACKUPDIR/db_daily_$DATE.sql.gz INCREASE_HEALTH=`echo $?` 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 was exist." return 0 else echo "$BACKUPDIR_OLDER is not exist, now create it." mkdir -pv $BACKUPDIR_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 $BACKUPDIR -name "*.sql.gz" -mtime +7 -exec ls -lh {} \;` returnkey_old=`find $BACKUPDIR_OLDER -name "*.sql.gz" -mtime +14 -exec ls -lh {} \;` if [[ $returnkey != '' ]];then echo "----------------------" echo "Moving the older backuped file out of 7 days to $BACKUPDIR_OLDER." echo "The moved file list is:" find $BACKUPDIR -name "*.sql.gz" -mtime +7 -exec mv {} $BACKUPDIR_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 from $BACKUPDIR_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_EXSIT $BACKUP_LOG OLDER_BACKDIR_EXSIT $BACKUP_LOG MAIN >> $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 空格 #加個空格,不然有些機器不能執行腳本
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。