现在的位置: 首页 > 综合 > 正文

Shell Script For MySQL Enterprise Backup Crontab Schedule

2014年07月29日 ⁄ 综合 ⁄ 共 5185字 ⁄ 字号 评论关闭
#!/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

抱歉!评论已关闭.