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:
- Lock MongoDB for writes using
fsync lockcommand, and simply copy database files over to backup destination. - Use built-in
mongodumpcommand 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: bash, linux, mongodb
Comments
- Reply erik on January 22, 2012, at 02:15 PM