Simple MongoDB backup script

Here's a simple MongoDB backup script which you can run on a daily basis to create an automatic dump of MongoDB and keep a certain number of days of backup stored.

Important: in order for the fsync lock functionality to work, you must have journaling enabled in your MongoDB instance. According to MongoDB documentation, 64-bit systems have journaling enabled by default starting with version 1.9.2, and on 32-bit systems it must be enabled manually with --journal option (or through config file).

The script backs up MongoDB in two ways:

  1. Lock MongoDB for writes using fsync lock command, and simply copy database files over to backup destination.
  2. Use built-in mongodump command to export data to backup destination.

In addition, it emails to configured email address when backup has failed. To disable this, simply leave MAIL_TO variable empty.

Here's the script, and you can also download it using this link.

#!/bin/sh

# Back up MongoDB content directory, keep backups up to 7 days old

SRC_DIR=/content/mongodb/data
BK_DIR=/content/mongodb/backup
MDB_PATH="/usr/bin"
MDB_HOST="127.0.0.1:27017"
MAIL_TO='me@example.com'
DATE_STR=$(date +%Y%m%d)

DEST_DIR=$BK_DIR/mongodb.$DATE_STR

function mailit {
    if [ -n "$MAIL_TO" ] ; then
        echo Host: `hostname` > /tmp/mailit.tmp
        echo Source dir: $SRC_DIR >> /tmp/mailit.tmp
        echo Source host: $MDB_HOST >> /tmp/mailit.tmp
        echo Dest dir: $DEST_DIR >> /tmp/mailit.tmp
        echo Mongodb path: $MDB_PATH >> /tmp/mailit.tmp

        mail -s "$1" "$MAIL_TO" < /tmp/mailit.tmp
        rm -f /tmp/mailit.tmp
    fi
}

echo "[mongodb-backup] Performing backup of $SRC_DIR to $BK_DIR on `date`"

# Run checks

if [ ! -d $SRC_DIR ] ; then
    echo "[mongodb-backup] Error: source directory $SRC_DIR does not exist"
    mailit "[mongodb-backup] Error: source directory $SRC_DIR does not exist"
    exit 1
fi

if [ ! -d $DEST_DIR ] ; then
    mkdir $DEST_DIR
    if [ ! "$?" -eq "0" ] ; then
        echo "[mongodb-backup] Error: could not create destination directory $DEST_DIR"
        mailit "[mongodb-backup] Error: could not create destination directory $DEST_DIR"
        exit 1
    fi
else
    echo "[mongodb-backup] Error: destination directory $DEST_DIR already exists"
    mailit "[mongodb-backup] Error: destination directory $DEST_DIR already exists"
    exit 1
fi


# Perform backup

# Backup 1: lock, copy files, unlock
echo
$MDB_PATH/mongo $MDB_HOST/admin --eval "printjson(db.runCommand({fsync:1,lock:1}))" --quiet
if [ ! "$?" -eq "0" ] ; then
    echo "[mongodb-backup] Error: mongo fsync lock command failed"
    mailit "[mongodb-backup] Error: mongo fsync lock command failed"
    exit $?
fi
echo Copying files from $SRC_DIR to $DEST_DIR
cp -a $SRC_DIR/* $DEST_DIR
$MDB_PATH/mongo $MDB_HOST/admin --eval "printjson(db.\$cmd.sys.unlock.findOne())" --quiet
if [ ! "$?" -eq "0" ] ; then
    echo "[mongodb-backup] Error: mongo fsync unlock command failed"
    mailit "[mongodb-backup] Error: mongo fsync unlock command failed"
    exit $?
fi
rm -f $DEST_DIR/mongod.lock

# Backup 2: mongodump
echo
exec $MDB_PATH/mongodump --host=$MDB_HOST --out=$DEST_DIR/mongodump
if [ ! "$?" -eq "0" ] ; then
    echo "[mongodb-backup] Error: mongodump command failed"
    mailit "[mongodb-backup] Error: mongodump command failed"
    exit $?
fi


# Remove old backups

REMOVE_DIRS=$(ls -d $BK_DIR/*/ | sort -r | sed '1,7d' | sort)

for i in $REMOVE_DIRS ; do
    echo "[mongodb-backup] Removing old backup $i"
    rm -rf $i
done

echo "[mongodb-backup] Backup completed successfully"
echo
11:25 AM | 1 Comment | Tags: , ,

Comments

  1. nice script. Will this work in win7 like a bat program?

    Reply erik on

Notify me when others comment on this post