#!/bin/ksh #prints usage usage() { echo "$VERSION" echo " Usage: `basename $0` [command] [MEB options] Commands: full make full backup incremental make incremental backup incremental-with-redo-log-only make incremental backup with redo log only verify-to-tape verify backup images, then copy to tape prepare prepare backups remove-old remove old backups " } # creates defaults values initialize() { VERSION=0.3 MEBOPTIONS= CURDATE=`date +%y%m%d_%H%M%S` #pre-defined defaults, can be overriden dMYSQLBACKUP="/service/mysql/bin/mysqlbackup" dBACKUPDIR=$HOME/BACKUPDIR dINCREMENTALDIR=$HOME/INCREMENTALDIR dPREPAREDDIR=$HOME/PREPAREDDIR dLOGDIR=$HOME/log dBACKUPIMAGENAME=backup dOUTLOG=backup_output.log dERRORLOG=backup_error.log dVERIFYTIME=42 dPREPARETIME=7 dREMOVETIME=180 #clean failed backups dCLEANUP=0 } #parses options parse_options() { if [ -z "$1" ] then usage exit 1 fi case $1 in full) COMMAND=do_full;; incremental) COMMAND=do_incremental;; incremental-with-redo-log-only) COMMAND=do_incremental_with_redo_log_only;; verify-to-tape) COMMAND=do_verify_to_tape;; prepare) COMMAND=do_prepare;; remove-old) COMMAND=do_remove_old;; *) usage; exit 1;; esac shift MEBOPTIONS=$@ #setting environment variables if [ -z $MYSQLBACKUP ] then MYSQLBACKUP=`which mysqlbackup` if [ -z $MYSQLBACKUP ] then MYSQLBACKUP=$dMYSQLBACKUP fi fi if [ -z $BACKUPDIR ] then BACKUPDIR=${dBACKUPDIR} fi if [ -z $INCREMENTALDIR ] then INCREMENTALDIR=${dINCREMENTALDIR} fi if [ -z $PREPAREDDIR ] then PREPAREDDIR=$dPREPAREDDIR fi if [ -z $LOGDIR ] then LOGDIR=$dLOGDIR fi if [ -z $BACKUPIMAGENAME ] then BACKUPIMAGENAME=${dBACKUPIMAGENAME}.${CURDATE}.bki fi if [ -z $OUTLOG ] then OUTLOG=${dOUTLOG}.${CURDATE} fi if [ -z $ERRORLOG ] then ERRORLOG=${dERRORLOG}.${CURDATE} fi if [ -z $VERIFYTIME ] then VERIFYTIME=$dVERIFYTIME fi if [ -z $PREPARETIME ] then PREPARETIME=$dPREPARETIME fi if [ -z $REMOVETIME ] then REMOVETIME=$dREMOVETIME fi if [ -z $CLEANUP ] then CLEANUP=$dCLEANUP fi } #cleans up failed backups cleanup() { result=$? if [[ 0 -ne $result ]] then echo "Backup failed" if [[ 1 -eq $CLEANUP ]] then echo "Environment variable CLEANUP set, removing corrupted backup image" rm -f $1 fi exit 1; else echo "Backup successful" fi if [[ 1 -eq $CLEANUP ]] then echo "Removing backup directory" fi } #makes full backup do_full() { $MYSQLBACKUP $MEBOPTIONS --backup-dir=$BACKUPDIR/${CURDATE} --backup-image=$BACKUPDIR/$BACKUPIMAGENAME backup-to-image >$LOGDIR/$OUTLOG 2>$LOGDIR/$ERRORLOG cleanup $BACKUPDIR/$BACKUPIMAGENAME } #makes incremental backup do_incremental() { $MYSQLBACKUP $MEBOPTIONS --incremental --incremental-base=history:last_backup --backup-dir=$INCREMENTALDIR/${CURDATE} --backup-image=$INCREMENTALDIR/$BACKUPIMAGENAME backup-to-image >$LOGDIR/$OUTLOG 2>$LOGDIR/$ERRORLOG cleanup $INCREMENTALDIR/$BACKUPIMAGENAME } #makes incremntal with redo long only backup do_incremental_with_redo_log_only() { $MYSQLBACKUP $MEBOPTIONS --incremental-with-redo-log-only --incremental-base=history:last_backup --backup-dir=$INCREMENTALDIR/${CURDATE} --backup-image=$INCREMENTALDIR/$BACKUPIMAGENAME backup-to-image >$LOGDIR/$OUTLOG 2>$LOGDIR/$ERRORLOG cleanup $INCREMENTALDIR/$BACKUPIMAGENAME } #verifies backup and writes to tape do_verify_to_tape() { fullbackup=(`find $BACKUPDIR -type f -atime +$VERIFYTIME`) incrementals=(`find $INCREMENTALDIR -type f -atime +$VERIFYTIME`) files=("${fullbackup[@]}" "${incrementals[@]}") for f in "${files[@]}" do $MYSQLBACKUP $MEBOPTIONS --backup-image=$f validate >$LOGDIR/$OUTLOG 2>$LOGDIR/$ERRORLOG result=$? if [[ 0 -eq $result ]] then echo "Here is supposed to be call which copies validated image to tape" #copy to tape here #since I don't know how customer is going to copy to tape leaving this part empty until I get explanation else echo "Here is supposed to be code which handles validation error" #also is not clear what to do with image which is not validated fi done } #prepares backup do_prepare() { fullbackup=(`find $BACKUPDIR -type f -atime +$PREPARETIME`) incrementals=(`find $INCREMENTALDIR -type f -atime +$PREPARETIME`) #for test only #fullbackup=(`ls --sort=t $BACKUPDIR/*bki`) #incrementals=(`ls --sort=t -r $INCREMENTALDIR/*bki`) #preparing full backup for f in "${fullbackup[@]}" do $MYSQLBACKUP $MEBOPTIONS --backup-image=$f --backup-dir=$PREPAREDDIR/${CURDATE} extract >>$LOGDIR/$OUTLOG 2>>$LOGDIR/$ERRORLOG result=$? if [[ 0 -eq $result ]] then $MYSQLBACKUP $MEBOPTIONS --backup-dir=$PREPAREDDIR/${CURDATE} apply-log >>$LOGDIR/$OUTLOG 2>>$LOGDIR/$ERRORLOG result=$? if [[ 0 -ne $result ]] then echo "212: Handle error" exit 1; fi else echo "216: Handle error" exit 1; fi break done i=0 for f in "${incrementals[@]}" do $MYSQLBACKUP $MEBOPTIONS --backup-image=$f --backup-dir=$INCREMENTALDIR/${CURDATE}_${i} extract >>$LOGDIR/$OUTLOG 2>>$LOGDIR/$ERRORLOG result=$? if [[ 0 -eq $result ]] then $MYSQLBACKUP $MEBOPTIONS --backup-dir=$PREPAREDDIR/${CURDATE} --incremental-backup-dir=$INCREMENTALDIR/${CURDATE}_${i} apply-incremental-backup >>$LOGDIR/$OUTLOG 2>>$LOGDIR/$ERRORLOG result=$? if [[ 0 -ne $result ]] then echo "232: Handle error" exit 1; fi else echo "236: Handle error" exit 1; fi let "i+=1" done } #removes old backups do_remove_old() { find $BACKUPDIR -type f -ctime +$REMOVETIME -exec rm {} \; find $INCREMENTALDIR -type f -ctime +$REMOVETIME -exec rm {} \; } initialize parse_options $@ $COMMAND exit 0
This script will run full backup two times per week, incremental backup every second day, incremental backup with redo log only every 8 hours. Every week backup would be verified and copied to tape. Everyday it will
be prepared and every 6 months old backup will be removed.
0 0 * * */3 autobackup.sh full
0 0 */2 * * autobackup.sh incremental
0 */8 * * autobackup.sh incremental-with-redo-log-only
0 0 * * */6 autobackup.sh verify-to-tape
0 0 * * * autobackup.sh prepare
0 0 0 */6 * autobackup.sh remove-old