Skip to content

Instantly share code, notes, and snippets.

@infynyxx
Created May 17, 2010 15:31
Show Gist options
  • Select an option

  • Save infynyxx/403885 to your computer and use it in GitHub Desktop.

Select an option

Save infynyxx/403885 to your computer and use it in GitHub Desktop.

Revisions

  1. infynyxx created this gist May 17, 2010.
    341 changes: 341 additions & 0 deletions automongobackup.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,341 @@
    #!/bin/bash
    #
    # MongoDB Backup Script
    # VER. 0.1
    # Note, this is a lobotomized port of AutoMySQLBackup
    # (http://sourceforge.net/projects/automysqlbackup/) for use with
    # MongoDB.
    #
    # This program is free software; you can redistribute it and/or modify
    # it under the terms of the GNU General Public License as published by
    # the Free Software Foundation; either version 2 of the License, or
    # (at your option) any later version.
    #
    # This program is distributed in the hope that it will be useful,
    # but WITHOUT ANY WARRANTY; without even the implied warranty of
    # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    # GNU General Public License for more details.
    #
    # You should have received a copy of the GNU General Public License
    # along with this program; if not, write to the Free Software
    # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
    #
    #=====================================================================
    #=====================================================================
    # Set the following variables to your system needs
    # (Detailed instructions below variables)
    #=====================================================================

    # Username to access the mongo server e.g. dbuser
    # Unnecessary if authentication is off
    # USERNAME=XXX

    # Username to access the mongo server e.g. password
    # Unnecessary if authentication is off
    # PASSWORD=XXX

    # Host name (or IP address) of mongo server e.g localhost
    DBHOST=127.0.0.1

    # Backup directory location e.g /backups
    BACKUPDIR="/var/backups/mongodb"

    # Mail setup
    # What would you like to be mailed to you?
    # - log : send only log file
    # - files : send log file and sql files as attachments (see docs)
    # - stdout : will simply output the log to the screen if run manually.
    # - quiet : Only send logs if an error occurs to the MAILADDR.
    MAILCONTENT="log"

    # Set the maximum allowed email size in k. (4000 = approx 5MB email [see docs])
    MAXATTSIZE="4000"

    # Email Address to send mail to? ([email protected])
    #MAILADDR=XXX


    # ============================================================
    # === ADVANCED OPTIONS ( Read the doc's below for details )===
    #=============================================================

    # Which day do you want weekly backups? (1 to 7 where 1 is Monday)
    DOWEEKLY=6

    # Command to run before backups (uncomment to use)
    #PREBACKUP="/etc/mysql-backup-pre"

    # Command run after backups (uncomment to use)
    #POSTBACKUP="/etc/mysql-backup-post"

    #=====================================================================
    # Options documentation
    #=====================================================================
    # Set USERNAME and PASSWORD of a user that has at least SELECT permission
    # to ALL databases.
    #
    # Set the DBHOST option to the server you wish to backup, leave the
    # default to backup "this server".(to backup multiple servers make
    # copies of this file and set the options for that server)
    #
    # You can change the backup storage location from /backups to anything
    # you like by using the BACKUPDIR setting..
    #
    # The MAILCONTENT and MAILADDR options and pretty self explanitory, use
    # these to have the backup log mailed to you at any email address or multiple
    # email addresses in a space seperated list.
    # (If you set mail content to "log" you will require access to the "mail" program
    # on your server. If you set this to "files" you will have to have mutt installed
    # on your server. If you set it to "stdout" it will log to the screen if run from
    # the console or to the cron job owner if run through cron. If you set it to "quiet"
    # logs will only be mailed if there are errors reported. )
    #
    #
    # Finally copy automongobackup.sh to anywhere on your server and make sure
    # to set executable permission. You can also copy the script to
    # /etc/cron.daily to have it execute automatically every night or simply
    # place a symlink in /etc/cron.daily to the file if you wish to keep it
    # somwhere else.
    # NOTE:On Debian copy the file with no extention for it to be run
    # by cron e.g just name the file "automongobackup"
    #
    # Thats it..
    #
    #
    # === Advanced options doc's ===
    #
    # To set the day of the week that you would like the weekly backup to happen
    # set the DOWEEKLY setting, this can be a value from 1 to 7 where 1 is Monday,
    # The default is 6 which means that weekly backups are done on a Saturday.
    #
    # Use PREBACKUP and POSTBACKUP to specify Per and Post backup commands
    # or scripts to perform tasks either before or after the backup process.
    #
    #
    #=====================================================================
    # Backup Rotation..
    #=====================================================================
    #
    # Daily Backups are rotated weekly..
    # Weekly Backups are run by default on Saturday Morning when
    # cron.daily scripts are run...Can be changed with DOWEEKLY setting..
    # Weekly Backups are rotated on a 5 week cycle..
    # Monthly Backups are run on the 1st of the month..
    # Monthly Backups are NOT rotated automatically...
    # It may be a good idea to copy Monthly backups offline or to another
    # server..
    #
    #=====================================================================
    # Please Note!!
    #=====================================================================
    #
    # I take no resposibility for any data loss or corruption when using
    # this script..
    # This script will not help in the event of a hard drive crash. If a
    # copy of the backup has not be stored offline or on another PC..
    # You should copy your backups offline regularly for best protection.
    #
    # Happy backing up...
    #
    #=====================================================================
    # Restoring
    #=====================================================================
    # ???
    #
    #=====================================================================
    # Change Log
    #=====================================================================
    #
    # VER 0.1 - (2010-05-11)
    # Initial Release
    #
    #=====================================================================
    #=====================================================================
    #=====================================================================
    #
    # Should not need to be modified from here down!!
    #
    #=====================================================================
    #=====================================================================
    #=====================================================================
    PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/mysql/bin:/Users/micah/mongo/mongodb-osx-x86_64-1.4.0/bin
    DATE=`date +%Y-%m-%d_%Hh%Mm` # Datestamp e.g 2002-09-21
    DOW=`date +%A` # Day of the week e.g. Monday
    DNOW=`date +%u` # Day number of the week 1 to 7 where 1 represents Monday
    DOM=`date +%d` # Date of the Month e.g. 27
    M=`date +%B` # Month e.g January
    W=`date +%V` # Week Number e.g 37
    VER=0.1 # Version Number
    LOGFILE=$BACKUPDIR/$DBHOST-`date +%N`.log # Logfile Name
    LOGERR=$BACKUPDIR/ERRORS_$DBHOST-`date +%N`.log # Logfile Name
    BACKUPFILES=""
    OPT="" # OPT string for use with mongodump

    # Do we need to use a username/password?
    if [ "$USERNAME" ]
    then
    OPT="$OPT --username=$USERNAME --password=$PASSWORD"
    fi

    # Create required directories
    if [ ! -e "$BACKUPDIR" ] # Check Backup Directory exists.
    then
    mkdir -p "$BACKUPDIR"
    fi

    if [ ! -e "$BACKUPDIR/daily" ] # Check Daily Directory exists.
    then
    mkdir -p "$BACKUPDIR/daily"
    fi

    if [ ! -e "$BACKUPDIR/weekly" ] # Check Weekly Directory exists.
    then
    mkdir -p "$BACKUPDIR/weekly"
    fi

    if [ ! -e "$BACKUPDIR/monthly" ] # Check Monthly Directory exists.
    then
    mkdir -p "$BACKUPDIR/monthly"
    fi

    # IO redirection for logging.
    touch $LOGFILE
    exec 6>&1 # Link file descriptor #6 with stdout.
    # Saves stdout.
    exec > $LOGFILE # stdout replaced with file $LOGFILE.
    touch $LOGERR
    exec 7>&2 # Link file descriptor #7 with stderr.
    # Saves stderr.
    exec 2> $LOGERR # stderr replaced with file $LOGERR.


    # Functions

    # Database dump function
    dbdump () {
    mongodump --host=$DBHOST --out=$1 $OPT
    return 0
    }


    # Run command before we begin
    if [ "$PREBACKUP" ]
    then
    echo ======================================================================
    echo "Prebackup command output."
    echo
    eval $PREBACKUP
    echo
    echo ======================================================================
    echo
    fi

    # Hostname for LOG information
    if [ "$DBHOST" = "localhost" ]; then
    HOST=`hostname`
    if [ "$SOCKET" ]; then
    OPT="$OPT --socket=$SOCKET"
    fi
    else
    HOST=$DBHOST
    fi

    echo ======================================================================
    echo AutoMongoBackup VER $VER
    echo
    echo Backup of Database Server - $HOST
    echo ======================================================================

    echo Backup Start `date`
    echo ======================================================================
    # Monthly Full Backup of all Databases
    if [ $DOM = "01" ]; then
    echo Monthly Full Backup
    dbdump "$BACKUPDIR/monthly/$DATE.$M"
    echo ----------------------------------------------------------------------
    fi

    # Weekly Backup
    if [ $DNOW = $DOWEEKLY ]; then
    echo Weekly Backup
    echo
    echo Rotating 5 weeks Backups...
    if [ "$W" -le 05 ];then
    REMW=`expr 48 + $W`
    elif [ "$W" -lt 15 ];then
    REMW=0`expr $W - 5`
    else
    REMW=`expr $W - 5`
    fi
    eval rm -fv "$BACKUPDIR/weekly/week.$REMW.*"
    echo
    dbdump "$BACKUPDIR/weekly/week.$W.$DATE"
    echo ----------------------------------------------------------------------

    # Daily Backup
    else
    echo Daily Backup of Databases
    echo
    echo Rotating last weeks Backup...
    eval rm -fv "$BACKUPDIR/daily/*.$DOW.*"
    echo
    dbdump "$BACKUPDIR/daily/$DATE.$DOW"
    echo ----------------------------------------------------------------------
    fi
    echo Backup End Time `date`
    echo ======================================================================

    echo Total disk space used for backup storage..
    echo Size - Location
    echo `du -hs "$BACKUPDIR"`
    echo
    echo ======================================================================

    # Run command when we're done
    if [ "$POSTBACKUP" ]
    then
    echo ======================================================================
    echo "Postbackup command output."
    echo
    eval $POSTBACKUP
    echo
    echo ======================================================================
    fi

    #Clean up IO redirection
    exec 1>&6 6>&- # Restore stdout and close file descriptor #6.
    exec 1>&7 7>&- # Restore stdout and close file descriptor #7.

    if [ "$MAILCONTENT" = "log" ]
    then
    cat "$LOGFILE" | mail -s "Mongo Backup Log for $HOST - $DATE" $MAILADDR
    if [ -s "$LOGERR" ]
    then
    cat "$LOGERR" | mail -s "ERRORS REPORTED: Mongo Backup error Log for $HOST - $DATE" $MAILADDR
    fi
    else
    if [ -s "$LOGERR" ]
    then
    cat "$LOGFILE"
    echo
    echo "###### WARNING ######"
    echo "Errors reported during AutoMongoBackup execution.. Backup failed"
    echo "Error log below.."
    cat "$LOGERR"
    else
    cat "$LOGFILE"
    fi
    fi

    if [ -s "$LOGERR" ]
    then
    STATUS=1
    else
    STATUS=0
    fi

    # Clean up Logfile
    eval rm -f "$LOGFILE"
    eval rm -f "$LOGERR"

    exit $STATUS