#!/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